summaryrefslogtreecommitdiff
path: root/Python/ceval.c
diff options
context:
space:
mode:
authorYury Selivanov <yury@edgedb.com>2022-01-11 15:37:09 -0800
committerGitHub <noreply@github.com>2022-01-11 15:37:09 -0800
commit20b5791ce9b47195ce51cfd5acb223b1ca59cdf0 (patch)
treed17543a64cc0a97988f3c7eeb91a41ea08e10051 /Python/ceval.c
parent08bc1bad11cad39f508bd662c9b28fcd9c995512 (diff)
downloadcpython-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.c22
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;
}