From 3a350b65a3ef743aa7d6f5567b66484a7b1dfd1d Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Thu, 19 Oct 2017 16:07:28 +0200 Subject: [PATCH] init: handle Service_denied for forwarded sessions This patch propages the 'Service_denied' condition of forwarded sessions to the parent. Without it, the invalid session request stays pending infinitely, which leads to the problem described in issue #2542. It turns out that suggested solution given in the issue text is actually not needed when applying this fix. Fixes #2542 --- repos/os/src/init/server.cc | 16 +++++++++++++--- repos/os/src/init/server.h | 2 ++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/repos/os/src/init/server.cc b/repos/os/src/init/server.cc index 5a112e437..faf5b2eba 100644 --- a/repos/os/src/init/server.cc +++ b/repos/os/src/init/server.cc @@ -142,10 +142,14 @@ void Init::Server::session_ready(Session_state &session) _env.parent().deliver_session_cap(id, session.cap); session.phase = Session_state::CAP_HANDED_OUT; } + + if (session.phase == Session_state::SERVICE_DENIED) + _close_session(session, Parent::SERVICE_DENIED); } -void Init::Server::session_closed(Session_state &session) +void Init::Server::_close_session(Session_state &session, + Parent::Session_response response) { _report_update_trigger.trigger_report_update(); @@ -162,7 +166,13 @@ void Init::Server::session_closed(Session_state &session) session.destroy(); - _env.parent().session_response(id, Parent::SESSION_CLOSED); + _env.parent().session_response(id, response); +} + + +void Init::Server::session_closed(Session_state &session) +{ + _close_session(session, Parent::SESSION_CLOSED); } @@ -342,7 +352,7 @@ void Init::Server::_handle_session_requests() Xml_node const requests = _session_requests->xml(); requests.for_each_sub_node([&] (Xml_node request) { - _handle_session_request(request); }); + _handle_session_request(request); }); _report_update_trigger.trigger_report_update(); } diff --git a/repos/os/src/init/server.h b/repos/os/src/init/server.h index 93b079380..45f0eef0c 100644 --- a/repos/os/src/init/server.h +++ b/repos/os/src/init/server.h @@ -86,6 +86,8 @@ class Init::Server : Session_state::Ready_callback, void _handle_session_request(Xml_node); void _handle_session_requests(); + void _close_session(Session_state &, Parent::Session_response response); + /** * Session_state::Closed_callback interface */