]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-130595: Fix leak in WITH_EXCEPT_START error case (GH-130626)
authorPetr Viktorin <encukou@gmail.com>
Fri, 28 Feb 2025 08:58:50 +0000 (09:58 +0100)
committerGitHub <noreply@github.com>
Fri, 28 Feb 2025 08:58:50 +0000 (08:58 +0000)
Co-authored-by: Ken Jin <kenjin@python.org>
Python/bytecodes.c
Python/executor_cases.c.h
Python/generated_cases.c.h

index dc709a7c0538350ce370b902177c09a702c73014..1b9b651fd01539813e24d4381d0c96524618814e 100644 (file)
@@ -3317,8 +3317,8 @@ dummy_func(
             int has_self = !PyStackRef_IsNull(exit_self);
             PyObject *res_o = PyObject_Vectorcall(exit_func_o, stack + 2 - has_self,
                     (3 + has_self) | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
-            ERROR_IF(res_o == NULL, error);
             Py_XDECREF(original_tb);
+            ERROR_IF(res_o == NULL, error);
             res = PyStackRef_FromPyObjectSteal(res_o);
         }
 
index 5468fc416294523c23128cf90dddd361605c5fa8..6ae88a817244b10de4992477b355c1b0a1d98ce8 100644 (file)
             _PyFrame_SetStackPointer(frame, stack_pointer);
             PyObject *res_o = PyObject_Vectorcall(exit_func_o, stack + 2 - has_self,
                 (3 + has_self) | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
+            Py_XDECREF(original_tb);
             stack_pointer = _PyFrame_GetStackPointer(frame);
             if (res_o == NULL) {
                 JUMP_TO_ERROR();
             }
-            _PyFrame_SetStackPointer(frame, stack_pointer);
-            Py_XDECREF(original_tb);
-            stack_pointer = _PyFrame_GetStackPointer(frame);
             res = PyStackRef_FromPyObjectSteal(res_o);
             stack_pointer[0] = res;
             stack_pointer += 1;
index 5f1198699c4f75c42ed0a61eefe2c4817dd20053..564e5be92ae789dffc03777a07fc14f36d179203 100644 (file)
             _PyFrame_SetStackPointer(frame, stack_pointer);
             PyObject *res_o = PyObject_Vectorcall(exit_func_o, stack + 2 - has_self,
                 (3 + has_self) | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
+            Py_XDECREF(original_tb);
             stack_pointer = _PyFrame_GetStackPointer(frame);
             if (res_o == NULL) {
                 JUMP_TO_LABEL(error);
             }
-            _PyFrame_SetStackPointer(frame, stack_pointer);
-            Py_XDECREF(original_tb);
-            stack_pointer = _PyFrame_GetStackPointer(frame);
             res = PyStackRef_FromPyObjectSteal(res_o);
             stack_pointer[0] = res;
             stack_pointer += 1;