|
@@ -24,6 +24,8 @@
|
|
|
#include <stdio.h>
|
|
|
|
|
|
#include "../../dprint.h"
|
|
|
+#include "../../mem/mem.h"
|
|
|
+
|
|
|
#include "python_mod.h"
|
|
|
|
|
|
void
|
|
@@ -31,11 +33,12 @@ python_handle_exception(const char *fname)
|
|
|
{
|
|
|
PyObject *pResult;
|
|
|
const char *msg;
|
|
|
+ char *buf;
|
|
|
+ size_t buflen;
|
|
|
PyObject *exception, *v, *tb, *args;
|
|
|
PyObject *line;
|
|
|
int i;
|
|
|
|
|
|
- LM_ERR("%s: Unhandled exception in the Python code:\n", fname);
|
|
|
PyErr_Fetch(&exception, &v, &tb);
|
|
|
PyErr_Clear();
|
|
|
if (exception == NULL) {
|
|
@@ -61,22 +64,56 @@ python_handle_exception(const char *fname)
|
|
|
LM_ERR("can't get traceback, traceback.format_exception() has failed\n");
|
|
|
return;
|
|
|
}
|
|
|
+
|
|
|
+ buflen = 1;
|
|
|
+ buf = (char *)pkg_malloc(buflen * sizeof(char *));
|
|
|
+ if (!buf)
|
|
|
+ {
|
|
|
+ LM_ERR("python_handle_exception(): Not enough memory\n");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ memset(&buf, 0, buflen * sizeof(char *));
|
|
|
+
|
|
|
for (i = 0; i < PySequence_Size(pResult); i++) {
|
|
|
line = PySequence_GetItem(pResult, i);
|
|
|
if (line == NULL) {
|
|
|
LM_ERR("can't get traceback, PySequence_GetItem() has failed\n");
|
|
|
Py_DECREF(pResult);
|
|
|
+ if (buf)
|
|
|
+ pkg_free(buf);
|
|
|
return;
|
|
|
}
|
|
|
+
|
|
|
msg = PyString_AsString(line);
|
|
|
+
|
|
|
if (msg == NULL) {
|
|
|
LM_ERR("can't get traceback, PyString_AsString() has failed\n");
|
|
|
Py_DECREF(line);
|
|
|
Py_DECREF(pResult);
|
|
|
+ if (buf)
|
|
|
+ pkg_free(buf);
|
|
|
return;
|
|
|
}
|
|
|
- LM_ERR("\t%s", msg);
|
|
|
+
|
|
|
+ buflen += strlen(msg);
|
|
|
+ buf = (char *)pkg_realloc(buf, (buflen + 1) * sizeof(char *));
|
|
|
+ if (!buf)
|
|
|
+ {
|
|
|
+ LM_ERR("python_handle_exception(): Not enough memory\n");
|
|
|
+ Py_DECREF(line);
|
|
|
+ Py_DECREF(pResult);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ strcat(buf, msg);
|
|
|
+
|
|
|
Py_DECREF(line);
|
|
|
}
|
|
|
+
|
|
|
+ LM_ERR("%s: Unhandled exception in the Python code:\n%s", fname, buf);
|
|
|
+
|
|
|
+ if (buf)
|
|
|
+ pkg_free(buf);
|
|
|
+
|
|
|
Py_DECREF(pResult);
|
|
|
}
|