mirror of
https://github.com/python/cpython.git
synced 2025-09-03 23:41:18 +00:00
bpo-46347: Fix PyEval_EvalCodeEx to correctly cleanup in error paths (#30551)
This commit is contained in:
parent
08bc1bad11
commit
20b5791ce9
1 changed files with 9 additions and 13 deletions
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue