Skip to content

Commit 20b5791

Browse files
authored
bpo-46347: Fix PyEval_EvalCodeEx to correctly cleanup in error paths (#30551)
1 parent 08bc1ba commit 20b5791

File tree

1 file changed

+9
-13
lines changed

1 file changed

+9
-13
lines changed

Python/ceval.c

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6086,7 +6086,7 @@ PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals,
60866086
PyObject *kwdefs, PyObject *closure)
60876087
{
60886088
PyThreadState *tstate = _PyThreadState_GET();
6089-
PyObject *res;
6089+
PyObject *res = NULL;
60906090
PyObject *defaults = _PyTuple_FromArray(defs, defcount);
60916091
if (defaults == NULL) {
60926092
return NULL;
@@ -6099,22 +6099,20 @@ PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals,
60996099
if (locals == NULL) {
61006100
locals = globals;
61016101
}
6102-
PyObject *kwnames;
6102+
PyObject *kwnames = NULL;
61036103
PyObject *const *allargs;
6104-
PyObject **newargs;
6104+
PyObject **newargs = NULL;
6105+
PyFunctionObject *func = NULL;
61056106
if (kwcount == 0) {
61066107
allargs = args;
6107-
kwnames = NULL;
61086108
}
61096109
else {
61106110
kwnames = PyTuple_New(kwcount);
61116111
if (kwnames == NULL) {
6112-
res = NULL;
61136112
goto fail;
61146113
}
61156114
newargs = PyMem_Malloc(sizeof(PyObject *)*(kwcount+argcount));
61166115
if (newargs == NULL) {
6117-
res = NULL;
61186116
Py_DECREF(kwnames);
61196117
goto fail;
61206118
}
@@ -6142,19 +6140,17 @@ PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals,
61426140
.fc_kwdefaults = kwdefs,
61436141
.fc_closure = closure
61446142
};
6145-
PyFunctionObject *func = _PyFunction_FromConstructor(&constr);
6143+
func = _PyFunction_FromConstructor(&constr);
61466144
if (func == NULL) {
6147-
return NULL;
6145+
goto fail;
61486146
}
61496147
res = _PyEval_Vector(tstate, func, locals,
61506148
allargs, argcount,
61516149
kwnames);
6152-
Py_DECREF(func);
6153-
if (kwcount) {
6154-
Py_DECREF(kwnames);
6155-
PyMem_Free(newargs);
6156-
}
61576150
fail:
6151+
Py_XDECREF(func);
6152+
Py_XDECREF(kwnames);
6153+
PyMem_Free(newargs);
61586154
Py_DECREF(defaults);
61596155
return res;
61606156
}

0 commit comments

Comments
 (0)