diff options
author | Tom Joseph <tomjoseph@in.ibm.com> | 2017-07-31 18:48:34 +0530 |
---|---|---|
committer | Patrick Williams <patrick@stwcx.xyz> | 2017-08-14 16:59:18 +0000 |
commit | 6516cef4711333d44f057f20998eb49dc100d650 (patch) | |
tree | d055e04c289eaa0840a1efd600140ecd9db3a987 | |
parent | 19b4f40e6bde61b7339905772861f3aa2ed224fa (diff) | |
download | phosphor-net-ipmid-6516cef4711333d44f057f20998eb49dc100d650.tar.gz phosphor-net-ipmid-6516cef4711333d44f057f20998eb49dc100d650.zip |
sol: Handle deactivate payload correctly when session is closed
Resolves openbmc/openbmc#1781
Resolves openbmc/openbmc#2053
Change-Id: Iabb61fc510d33a4132e7ad07184eb8847301b686
Signed-off-by: Tom Joseph <tomjoseph@in.ibm.com>
-rw-r--r-- | command/payload_cmds.cpp | 19 | ||||
-rw-r--r-- | sessions_manager.cpp | 2 |
2 files changed, 19 insertions, 2 deletions
diff --git a/command/payload_cmds.cpp b/command/payload_cmds.cpp index 2020722..0cc52cc 100644 --- a/command/payload_cmds.cpp +++ b/command/payload_cmds.cpp @@ -127,13 +127,28 @@ std::vector<uint8_t> deactivatePayload(const std::vector<uint8_t>& inPayload, (request->payloadInstance); auto sessionID = context.sessionID; - activating(request->payloadInstance, sessionID); std::get<sol::Manager&>(singletonPool).stopPayloadInstance( request->payloadInstance); + try + { + activating(request->payloadInstance, sessionID); + } + catch (std::exception& e) + { + log<level::INFO>(e.what()); + /* + * In case session has been closed (like in the case of inactivity + * timeout), then activating function would throw an exception, + * since sessionID is not found. IPMI success completion code is + * returned, since the session is closed. + */ + return outPayload; + } + auto check = std::get<session::Manager&>(singletonPool).stopSession (sessionID); - if(!check) + if (!check) { response->completionCode = IPMI_CC_UNSPECIFIED_ERROR; } diff --git a/sessions_manager.cpp b/sessions_manager.cpp index 18c96ba..ee4a35f 100644 --- a/sessions_manager.cpp +++ b/sessions_manager.cpp @@ -126,6 +126,7 @@ std::weak_ptr<Session> Manager::getSession(SessionID sessionID, { return iter->second; } + break; } case RetrieveOption::RC_SESSION_ID: { @@ -142,6 +143,7 @@ std::weak_ptr<Session> Manager::getSession(SessionID sessionID, { return iter->second; } + break; } default: throw std::runtime_error("Invalid retrieval option"); |