mgr: fixes python error handling

The current `handle_pyerror` function implementation relies in the
`traceback.format_exception_only` python function to format the
exception object. The problem is that this python function might also
raise an exception. This commit fixes it by enclosing that python
function call in try...catch block.

Fixes: http://tracker.ceph.com/issues/23406

Signed-off-by: Ricardo Dias <rdias@suse.com>
This commit is contained in:
Ricardo Dias 2018-03-22 12:07:24 +00:00
parent a392e612cc
commit 072699d863
No known key found for this signature in database
GPG Key ID: 74390C579BD37B68

View File

@ -40,10 +40,30 @@ std::string handle_pyerror()
object traceback(import("traceback"));
if (!tb) {
object format_exception_only(traceback.attr("format_exception_only"));
formatted_list = format_exception_only(hexc, hval);
try {
formatted_list = format_exception_only(hexc, hval);
} catch (error_already_set const &) {
// error while processing exception object
// returning only the exception string value
PyObject *name_attr = PyObject_GetAttrString(exc, "__name__");
std::stringstream ss;
ss << PyString_AsString(name_attr) << ": " << PyString_AsString(val);
Py_XDECREF(name_attr);
return ss.str();
}
} else {
object format_exception(traceback.attr("format_exception"));
formatted_list = format_exception(hexc,hval, htb);
try {
formatted_list = format_exception(hexc, hval, htb);
} catch (error_already_set const &) {
// error while processing exception object
// returning only the exception string value
PyObject *name_attr = PyObject_GetAttrString(exc, "__name__");
std::stringstream ss;
ss << PyString_AsString(name_attr) << ": " << PyString_AsString(val);
Py_XDECREF(name_attr);
return ss.str();
}
}
formatted = str("").join(formatted_list);
return extract<std::string>(formatted);