https://github.com/python/cpython/commit/954b2cf031fb84ff3386251d5c45281f47229003
commit: 954b2cf031fb84ff3386251d5c45281f47229003
branch: main
author: Bartosz Sławecki <bart...@ilikepython.com>
committer: Eclips4 <kirill.ba...@mail.ru>
date: 2025-04-17T10:14:55+03:00
summary:

gh-130070: Fix `exec(<string>, closure=<non-None>)` unexpected path (#130071)

Fixed an assertion error (so, it could be reproduced only in builds with 
assertions enabled)
for `exec` when the `source` argument is a string and the `closure` argument is 
not `None`.

Co-authored-by: sobolevn <m...@sobolevn.me>

files:
A 
Misc/NEWS.d/next/Core_and_Builtins/2025-02-13-05-09-31.gh-issue-130070.C8c9gK.rst
M Lib/test/test_builtin.py
M Python/bltinmodule.c

diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py
index 27b14c36b51b50..31597a320d418a 100644
--- a/Lib/test/test_builtin.py
+++ b/Lib/test/test_builtin.py
@@ -1061,8 +1061,24 @@ def four_freevars():
             three_freevars.__code__,
             three_freevars.__globals__,
             closure=my_closure)
+        my_closure = tuple(my_closure)
+
+        # should fail: anything passed to closure= isn't allowed
+        # when the source is a string
+        self.assertRaises(TypeError,
+            exec,
+            "pass",
+            closure=int)
+
+        # should fail: correct closure= argument isn't allowed
+        # when the source is a string
+        self.assertRaises(TypeError,
+            exec,
+            "pass",
+            closure=my_closure)
 
         # should fail: closure tuple with one non-cell-var
+        my_closure = list(my_closure)
         my_closure[0] = int
         my_closure = tuple(my_closure)
         self.assertRaises(TypeError,
diff --git 
a/Misc/NEWS.d/next/Core_and_Builtins/2025-02-13-05-09-31.gh-issue-130070.C8c9gK.rst
 
b/Misc/NEWS.d/next/Core_and_Builtins/2025-02-13-05-09-31.gh-issue-130070.C8c9gK.rst
new file mode 100644
index 00000000000000..f9e135f1902b8a
--- /dev/null
+++ 
b/Misc/NEWS.d/next/Core_and_Builtins/2025-02-13-05-09-31.gh-issue-130070.C8c9gK.rst
@@ -0,0 +1 @@
+Fixed an assertion error for :func:`exec` passed a string ``source`` and a 
non-``None`` ``closure``. Patch by Bartosz Sławecki.
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index 10e415fa052f64..8ed0a96270b4ee 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -1169,6 +1169,7 @@ builtin_exec_impl(PyObject *module, PyObject *source, 
PyObject *globals,
         if (closure != NULL) {
             PyErr_SetString(PyExc_TypeError,
                 "closure can only be used when source is a code object");
+            goto error;
         }
         PyObject *source_copy;
         const char *str;

_______________________________________________
Python-checkins mailing list -- python-checkins@python.org
To unsubscribe send an email to python-checkins-le...@python.org
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: arch...@mail-archive.com

Reply via email to