Issue #23782: Fixed possible memory leak in _PyTraceback_Add() and exception

loss in PyTraceBack_Here().
This commit is contained in:
Serhiy Storchaka 2016-10-18 13:23:18 +03:00
parent e5b0bd1ba2
commit 04eb777279
2 changed files with 29 additions and 20 deletions

View file

@ -132,47 +132,53 @@ newtracebackobject(PyTracebackObject *next, PyFrameObject *frame)
int
PyTraceBack_Here(PyFrameObject *frame)
{
PyThreadState *tstate = PyThreadState_GET();
PyTracebackObject *oldtb = (PyTracebackObject *) tstate->curexc_traceback;
PyTracebackObject *tb = newtracebackobject(oldtb, frame);
if (tb == NULL)
PyObject *exc, *val, *tb, *newtb;
PyErr_Fetch(&exc, &val, &tb);
newtb = (PyObject *)newtracebackobject((PyTracebackObject *)tb, frame);
if (newtb == NULL) {
_PyErr_ChainExceptions(exc, val, tb);
return -1;
tstate->curexc_traceback = (PyObject *)tb;
Py_XDECREF(oldtb);
}
PyErr_Restore(exc, val, newtb);
Py_XDECREF(tb);
return 0;
}
/* Insert a frame into the traceback for (funcname, filename, lineno). */
void _PyTraceback_Add(const char *funcname, const char *filename, int lineno)
{
PyObject *globals = NULL;
PyCodeObject *code = NULL;
PyFrameObject *frame = NULL;
PyObject *exception, *value, *tb;
PyObject *globals;
PyCodeObject *code;
PyFrameObject *frame;
PyObject *exc, *val, *tb;
/* Save and clear the current exception. Python functions must not be
called with an exception set. Calling Python functions happens when
the codec of the filesystem encoding is implemented in pure Python. */
PyErr_Fetch(&exception, &value, &tb);
PyErr_Fetch(&exc, &val, &tb);
globals = PyDict_New();
if (!globals)
goto done;
goto error;
code = PyCode_NewEmpty(filename, funcname, lineno);
if (!code)
goto done;
if (!code) {
Py_DECREF(globals);
goto error;
}
frame = PyFrame_New(PyThreadState_Get(), code, globals, NULL);
Py_DECREF(globals);
Py_DECREF(code);
if (!frame)
goto done;
goto error;
frame->f_lineno = lineno;
PyErr_Restore(exception, value, tb);
PyErr_Restore(exc, val, tb);
PyTraceBack_Here(frame);
Py_DECREF(frame);
return;
done:
Py_XDECREF(globals);
Py_XDECREF(code);
Py_XDECREF(frame);
error:
_PyErr_ChainExceptions(exc, val, tb);
}
static PyObject *