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

1st1 webhook-mailer at python.org
Tue Jan 11 18:37:18 EST 2022


https://github.com/python/cpython/commit/20b5791ce9b47195ce51cfd5acb223b1ca59cdf0
commit: 20b5791ce9b47195ce51cfd5acb223b1ca59cdf0
branch: main
author: Yury Selivanov <yury at edgedb.com>
committer: 1st1 <yury at edgedb.com>
date: 2022-01-11T15:37:09-08:00
summary:

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

files:
M Python/ceval.c

diff --git a/Python/ceval.c b/Python/ceval.c
index 85b4400de32f4..c512afadb1f7a 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;
 }



More information about the Python-checkins mailing list