mirror of
https://github.com/python/cpython.git
synced 2025-12-08 06:10:17 +00:00
bpo-46347: Fix PyEval_EvalCodeEx to correctly cleanup in error paths (#30553)
This commit is contained in:
parent
b1a94f1fab
commit
6f9ca53a6a
1 changed files with 5 additions and 11 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue