summaryrefslogtreecommitdiffstats
path: root/ipmid.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ipmid.cpp')
-rw-r--r--ipmid.cpp21
1 files changed, 17 insertions, 4 deletions
diff --git a/ipmid.cpp b/ipmid.cpp
index c48df3b..3d7c663 100644
--- a/ipmid.cpp
+++ b/ipmid.cpp
@@ -239,10 +239,23 @@ ipmi_ret_t ipmi_netfn_router(ipmi_netfn_t netfn, ipmi_cmd_t cmd, ipmi_request_t
// make sense.
char *respo = &((char *)response)[IPMI_CC_LEN];
- // Response message from the plugin goes into a byte post the base response
- rc = (handler_and_context.first) (netfn, cmd, request, respo,
- data_len, handler_and_context.second);
-
+ try
+ {
+ // Response message from the plugin goes into a byte post the base
+ // response
+ rc = (handler_and_context.first) (netfn, cmd, request, respo,
+ data_len, handler_and_context.second);
+ }
+ // IPMI command handlers can throw unhandled exceptions, catch those
+ // and return sane error code.
+ catch (const std::exception &e)
+ {
+ log<level::ERR>(e.what(), entry("NET_FUN=0x%X", netfn),
+ entry("CMD=0x%X", cmd));
+ rc = IPMI_CC_UNSPECIFIED_ERROR;
+ *data_len = 0;
+ // fall through
+ }
// Now copy the return code that we got from handler and pack it in first
// byte.
memcpy(response, &rc, IPMI_CC_LEN);
OpenPOWER on IntegriCloud