From 2bbe8405970d23575e7e76785787dbdf09d834d1 Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Wed, 27 Mar 2013 12:19:53 +0100 Subject: [PATCH] core: Handle disappearing managed dataspaces This patch adds the consideration of suddenly disappearing managed dataspaces in the 'Rm_session_component::reverse_lookup' function. Previously, this case resulted in a seamingly valid translation. Fixes #701 --- base/src/core/rm_session_component.cc | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/base/src/core/rm_session_component.cc b/base/src/core/rm_session_component.cc index 5bc5d1c2c..828aaeb9f 100644 --- a/base/src/core/rm_session_component.cc +++ b/base/src/core/rm_session_component.cc @@ -723,16 +723,19 @@ bool Rm_session_component::reverse_lookup(addr_t dst_base, /* constrain source fault area by the source dataspace dimensions */ src_fault_area->constrain(src_base, (*src_dataspace)->size()); - bool lookup = src_fault_area->valid() && dst_fault_area->valid(); - - if (!lookup) - return lookup; + if (!src_fault_area->valid() || !dst_fault_area->valid()) + return false; /* lookup and lock nested dataspace if required */ Native_capability session_cap = (*src_dataspace)->sub_rm_session(); - *sub_rm_session = dynamic_cast(_session_ep->lookup_and_lock(session_cap)); + if (session_cap.valid()) { + *sub_rm_session = dynamic_cast(_session_ep->lookup_and_lock(session_cap)); + return (*sub_rm_session != 0); + } - return lookup; + /* loop refer to leaf */ + *sub_rm_session = 0; + return true; }