]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
GH-141861: Fix invalid memory read in the ENTER_EXECUTOR (GH-141921)
authorSergey Miryanov <sergey.miryanov@gmail.com>
Mon, 24 Nov 2025 22:07:45 +0000 (03:07 +0500)
committerGitHub <noreply@github.com>
Mon, 24 Nov 2025 22:07:45 +0000 (22:07 +0000)
Lib/test/test_capi/test_opt.py
Misc/NEWS.d/next/Core_and_Builtins/2025-11-25-02-23-31.gh-issue-141861.QcMdcM.rst [new file with mode: 0644]
Python/bytecodes.c
Python/generated_cases.c.h

index 58242f9ac3a01ff4aefea9308ff5c2942da274d0..51234a2e40f54fd28c8b9bcb18fde89039e6432f 100644 (file)
@@ -2662,6 +2662,38 @@ class TestUopsOptimization(unittest.TestCase):
                               f" {executor} at offset {idx} rather"
                               f" than expected _EXIT_TRACE")
 
+    def test_enter_executor_valid_op_arg(self):
+        script_helper.assert_python_ok("-c", textwrap.dedent("""
+            import sys
+            sys.setrecursionlimit(30) # reduce time of the run
+
+            str_v1 = ''
+            tuple_v2 = (None, None, None, None, None)
+            small_int_v3 = 4
+
+            def f1():
+
+                for _ in range(10):
+                    abs(0)
+
+                tuple_v2[small_int_v3]
+                tuple_v2[small_int_v3]
+                tuple_v2[small_int_v3]
+
+                def recursive_wrapper_4569():
+                    str_v1 > str_v1
+                    str_v1 > str_v1
+                    str_v1 > str_v1
+                    recursive_wrapper_4569()
+
+                recursive_wrapper_4569()
+
+            for i_f1 in range(19000):
+                try:
+                    f1()
+                except RecursionError:
+                    pass
+        """))
 
 
 def global_identity(x):
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-25-02-23-31.gh-issue-141861.QcMdcM.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-25-02-23-31.gh-issue-141861.QcMdcM.rst
new file mode 100644 (file)
index 0000000..4a11566
--- /dev/null
@@ -0,0 +1 @@
+Fix invalid memory read in the ``ENTER_EXECUTOR`` instruction.
index 12ee506e4f2bc427e3d0a3535fcd8713be36a821..6129ea2e72327351f5ebdf5fe6810db5ae18716a 100644 (file)
@@ -3018,7 +3018,7 @@ dummy_func(
                 goto stop_tracing;
             }
             PyCodeObject *code = _PyFrame_GetCode(frame);
-            _PyExecutorObject *executor = code->co_executors->executors[oparg & 255];
+            _PyExecutorObject *executor = code->co_executors->executors[this_instr->op.arg];
             assert(executor->vm_data.index == INSTR_OFFSET() - 1);
             assert(executor->vm_data.code == code);
             assert(executor->vm_data.valid);
index b83b7c528e9150525a4e67b0d40270557881061b..47805c270f9a0ec5243b859e8db9fa081e91e665 100644 (file)
                 JUMP_TO_LABEL(stop_tracing);
             }
             PyCodeObject *code = _PyFrame_GetCode(frame);
-            _PyExecutorObject *executor = code->co_executors->executors[oparg & 255];
+            _PyExecutorObject *executor = code->co_executors->executors[this_instr->op.arg];
             assert(executor->vm_data.index == INSTR_OFFSET() - 1);
             assert(executor->vm_data.code == code);
             assert(executor->vm_data.valid);