diff --git a/repos/base-nova/src/lib/base/rpc_entrypoint.cc b/repos/base-nova/src/lib/base/rpc_entrypoint.cc index c827d656ef..7ac4b5520f 100644 --- a/repos/base-nova/src/lib/base/rpc_entrypoint.cc +++ b/repos/base-nova/src/lib/base/rpc_entrypoint.cc @@ -36,6 +36,12 @@ Untyped_capability Rpc_entrypoint::_manage(Rpc_object_base *obj) { using namespace Nova; + /* don't manage RPC object twice */ + if (obj->cap().valid()) { + warning("attempt to manage RPC object twice"); + return obj->cap(); + } + Untyped_capability ec_cap; /* _ec_sel is invalid until thread gets started */ @@ -60,6 +66,10 @@ Untyped_capability Rpc_entrypoint::_manage(Rpc_object_base *obj) void Rpc_entrypoint::_dissolve(Rpc_object_base *obj) { + /* don't dissolve RPC object twice */ + if (!obj->cap().valid()) + return; + /* de-announce object from cap_session */ _free_rpc_cap(_pd_session, obj->cap()); diff --git a/repos/base/include/root/component.h b/repos/base/include/root/component.h index a674b395f1..c3ffe25283 100644 --- a/repos/base/include/root/component.h +++ b/repos/base/include/root/component.h @@ -169,7 +169,12 @@ class Genode::Root_component : public Rpc_object >, throw Root::Unavailable(); } - _ep->manage(s); + /* + * Consider that the session-object constructor may already have + * called 'manage'. + */ + if (!s->cap().valid()) + _ep->manage(s); aquire_guard.ack = true; return *s; diff --git a/repos/base/src/lib/base/rpc_dispatch_loop.cc b/repos/base/src/lib/base/rpc_dispatch_loop.cc index eacada0154..dc95fd4f1d 100644 --- a/repos/base/src/lib/base/rpc_dispatch_loop.cc +++ b/repos/base/src/lib/base/rpc_dispatch_loop.cc @@ -27,6 +27,12 @@ using namespace Genode; Untyped_capability Rpc_entrypoint::_manage(Rpc_object_base *obj) { + /* don't manage RPC object twice */ + if (obj->cap().valid()) { + warning("attempt to manage RPC object twice"); + return obj->cap(); + } + Untyped_capability new_obj_cap = _alloc_rpc_cap(_pd_session, _cap); /* add server object to object pool */ diff --git a/repos/base/src/lib/base/rpc_entrypoint.cc b/repos/base/src/lib/base/rpc_entrypoint.cc index 2a7966d4df..3024e86b2c 100644 --- a/repos/base/src/lib/base/rpc_entrypoint.cc +++ b/repos/base/src/lib/base/rpc_entrypoint.cc @@ -26,6 +26,10 @@ using namespace Genode; void Rpc_entrypoint::_dissolve(Rpc_object_base *obj) { + /* don't dissolve RPC object twice */ + if (!obj->cap().valid()) + return; + /* make sure nobody is able to find this object */ remove(obj);