mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +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
	
	 Yury Selivanov
						Yury Selivanov