diff options
author | Yury Selivanov <yury@edgedb.com> | 2022-01-11 15:37:09 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-01-11 15:37:09 -0800 |
commit | 20b5791ce9b47195ce51cfd5acb223b1ca59cdf0 (patch) | |
tree | d17543a64cc0a97988f3c7eeb91a41ea08e10051 /Python/ceval.c | |
parent | 08bc1bad11cad39f508bd662c9b28fcd9c995512 (diff) | |
download | cpython-git-20b5791ce9b47195ce51cfd5acb223b1ca59cdf0.tar.gz |
bpo-46347: Fix PyEval_EvalCodeEx to correctly cleanup in error paths (#30551)
Diffstat (limited to 'Python/ceval.c')
-rw-r--r-- | Python/ceval.c | 22 |
1 files changed, 9 insertions, 13 deletions
diff --git a/Python/ceval.c b/Python/ceval.c index 85b4400de3..c512afadb1 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -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; } |