diff options
author | Yury Selivanov <yury@edgedb.com> | 2022-01-12 00:17:42 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-01-12 00:17:42 (GMT) |
commit | 6f9ca53a6ac343a5663cc5c52546acf9a63b605a (patch) | |
tree | 9b22c8e3896951f75dc0439e7c3ff56196324939 /Python | |
parent | b1a94f1fab7c0aee0705483616a1b2c3f2713c00 (diff) | |
download | cpython-6f9ca53a6ac343a5663cc5c52546acf9a63b605a.zip cpython-6f9ca53a6ac343a5663cc5c52546acf9a63b605a.tar.gz cpython-6f9ca53a6ac343a5663cc5c52546acf9a63b605a.tar.bz2 |
bpo-46347: Fix PyEval_EvalCodeEx to correctly cleanup in error paths (#30553)
Diffstat (limited to 'Python')
-rw-r--r-- | Python/ceval.c | 16 |
1 files changed, 5 insertions, 11 deletions
diff --git a/Python/ceval.c b/Python/ceval.c index e906076..ab10b41 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -5090,7 +5090,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; @@ -5103,23 +5103,19 @@ 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; 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; } for (int i = 0; i < argcount; i++) { @@ -5149,11 +5145,9 @@ PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals, res = _PyEval_Vector(tstate, &constr, locals, allargs, argcount, kwnames); - if (kwcount) { - Py_DECREF(kwnames); - PyMem_Free(newargs); - } fail: + Py_XDECREF(kwnames); + PyMem_Free(newargs); Py_DECREF(defaults); return res; } |