]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-126654: Fix crash in several functions in `_interpreters` module (#126678)
authorsobolevn <mail@sobolevn.me>
Mon, 11 Nov 2024 11:35:56 +0000 (14:35 +0300)
committerGitHub <noreply@github.com>
Mon, 11 Nov 2024 11:35:56 +0000 (17:05 +0530)
Lib/test/test__interpreters.py
Misc/NEWS.d/next/Library/2024-11-11-13-00-21.gh-issue-126654.4gfP2y.rst [new file with mode: 0644]
Modules/_interpretersmodule.c

index 14cd50bd30502cec5dfa1f72330ed5e929d1f6a9..bf3165e2341949f57aeb61637ca13c17425e0846 100644 (file)
@@ -551,6 +551,24 @@ class DestroyTests(TestBase):
             self.assertTrue(_interpreters.is_running(interp))
 
 
+class CommonTests(TestBase):
+    def setUp(self):
+        super().setUp()
+        self.id = _interpreters.create()
+
+    def test_signatures(self):
+        # for method in ['exec', 'run_string', 'run_func']:
+        msg = "expected 'shared' to be a dict"
+        with self.assertRaisesRegex(TypeError, msg):
+            _interpreters.exec(self.id, 'a', 1)
+        with self.assertRaisesRegex(TypeError, msg):
+            _interpreters.exec(self.id, 'a', shared=1)
+        with self.assertRaisesRegex(TypeError, msg):
+            _interpreters.run_string(self.id, 'a', shared=1)
+        with self.assertRaisesRegex(TypeError, msg):
+            _interpreters.run_func(self.id, lambda: None, shared=1)
+
+
 class RunStringTests(TestBase):
 
     def setUp(self):
diff --git a/Misc/NEWS.d/next/Library/2024-11-11-13-00-21.gh-issue-126654.4gfP2y.rst b/Misc/NEWS.d/next/Library/2024-11-11-13-00-21.gh-issue-126654.4gfP2y.rst
new file mode 100644 (file)
index 0000000..750158e
--- /dev/null
@@ -0,0 +1,2 @@
+Fix crash when non-dict was passed to several functions in ``_interpreters``
+module.
index 95acdd69e53260f683674a8a8666a8898d5c2105..a9a966e79e0920bd219aebcb76c42fb0a311da61 100644 (file)
@@ -936,6 +936,11 @@ static int
 _interp_exec(PyObject *self, PyInterpreterState *interp,
              PyObject *code_arg, PyObject *shared_arg, PyObject **p_excinfo)
 {
+    if (shared_arg != NULL && !PyDict_CheckExact(shared_arg)) {
+        PyErr_SetString(PyExc_TypeError, "expected 'shared' to be a dict");
+        return -1;
+    }
+
     // Extract code.
     Py_ssize_t codestrlen = -1;
     PyObject *bytes_obj = NULL;