summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTom Joseph <tomjoseph@in.ibm.com>2017-07-31 18:48:34 +0530
committerPatrick Williams <patrick@stwcx.xyz>2017-08-14 16:59:18 +0000
commit6516cef4711333d44f057f20998eb49dc100d650 (patch)
treed055e04c289eaa0840a1efd600140ecd9db3a987
parent19b4f40e6bde61b7339905772861f3aa2ed224fa (diff)
downloadphosphor-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.cpp19
-rw-r--r--sessions_manager.cpp2
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");
OpenPOWER on IntegriCloud