From 0202048eb6529e98a5ffd3494f6cdad052706a89 Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Fri, 3 Mar 2017 12:45:03 +0100 Subject: [PATCH] base: gracefully handle invalid env session routes This patch addresses the corner cases where an environment session could not be routed, i.e., if an environment LOG log session is routed to a non-existing child. --- repos/base/include/base/child.h | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/repos/base/include/base/child.h b/repos/base/include/base/child.h index 746c5b7b4..c469056f3 100644 --- a/repos/base/include/base/child.h +++ b/repos/base/include/base/child.h @@ -516,22 +516,28 @@ class Genode::Child : protected Rpc_object, if (_connection.constructed()) return; - Child_policy::Route const route = - _child._resolve_session_request(_child._policy, - _service_name(), - _args.string()); - - _env_service.construct(_child, route.service); - _connection.construct(*_env_service, _child._id_space, _client_id, - _args, _child._policy.filter_session_affinity(Affinity()), - route.label); + try { + Child_policy::Route const route = + _child._resolve_session_request(_child._policy, + _service_name(), + _args.string()); + _env_service.construct(_child, route.service); + _connection.construct(*_env_service, _child._id_space, _client_id, + _args, _child._policy.filter_session_affinity(Affinity()), + route.label); + } + catch (Parent::Service_denied) { + error(_child._policy.name(), ": ", _service_name(), " " + "environment session denied"); } } typedef typename CONNECTION::Session_type SESSION; SESSION &session() { return _connection->session(); } - Capability cap() const { return _connection->cap(); } + Capability cap() const { + return _connection.constructed() ? _connection->cap() + : Capability(); } }; Env_connection _ram { *this, Env::ram(), _policy.name() };