Fix to return sane error code

Any unhandled exception in the IPMI command handler
crashes the ipmi stack. IPMI command handler also becomes
bulky to catch all exceptions which must return unspecified
errors. This fix adds a catch in the ipmi router command handler
functions, and returns IPMI_CC_UNSPECIFIED_ERROR for all the
unhandled exceptions. With this fix, exceptions which has to
throw IPMI_CC_UNSPECIFIED_ERROR, doesn't needs to be handled in the
command handlers.

Change-Id: I6cf9fa1f0e5c1d71c57eebb9a2d451fa986168d3
Signed-off-by: Richard Marian Thomaiyar <richard.marian.thomaiyar@linux.intel.com>
diff --git a/ipmid.cpp b/ipmid.cpp
index c48df3b..3d7c663 100644
--- a/ipmid.cpp
+++ b/ipmid.cpp
@@ -239,10 +239,23 @@
     // 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);