bpo-46347: Fix PyEval_EvalCodeEx to correctly cleanup in error paths (#30551)

This commit is contained in:
Yury Selivanov 2022-01-11 15:37:09 -08:00 committed by GitHub
parent 08bc1bad11
commit 20b5791ce9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -6086,7 +6086,7 @@ PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals,
PyObject *kwdefs, PyObject *closure)
{
PyThreadState *tstate = _PyThreadState_GET();
PyObject *res;
PyObject *res = NULL;
PyObject *defaults = _PyTuple_FromArray(defs, defcount);
if (defaults == NULL) {
return NULL;
@ -6099,22 +6099,20 @@ PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals,
if (locals == NULL) {
locals = globals;
}
PyObject *kwnames;
PyObject *kwnames = NULL;
PyObject *const *allargs;
PyObject **newargs;
PyObject **newargs = NULL;
PyFunctionObject *func = NULL;
if (kwcount == 0) {
allargs = args;
kwnames = NULL;
}
else {
kwnames = PyTuple_New(kwcount);
if (kwnames == NULL) {
res = NULL;
goto fail;
}
newargs = PyMem_Malloc(sizeof(PyObject *)*(kwcount+argcount));
if (newargs == NULL) {
res = NULL;
Py_DECREF(kwnames);
goto fail;
}
@ -6142,19 +6140,17 @@ PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals,
.fc_kwdefaults = kwdefs,
.fc_closure = closure
};
PyFunctionObject *func = _PyFunction_FromConstructor(&constr);
func = _PyFunction_FromConstructor(&constr);
if (func == NULL) {
return NULL;
goto fail;
}
res = _PyEval_Vector(tstate, func, locals,
allargs, argcount,
kwnames);
Py_DECREF(func);
if (kwcount) {
Py_DECREF(kwnames);
PyMem_Free(newargs);
}
fail:
Py_XDECREF(func);
Py_XDECREF(kwnames);
PyMem_Free(newargs);
Py_DECREF(defaults);
return res;
}