Skip to content

Commit 9fc2808

Browse files
authored
gh-126654: Fix crash in several functions in _interpreters module (#126678)
1 parent 6ee542d commit 9fc2808

File tree

3 files changed

+25
-0
lines changed

3 files changed

+25
-0
lines changed

Lib/test/test__interpreters.py

+18
Original file line numberDiff line numberDiff line change
@@ -551,6 +551,24 @@ def test_still_running(self):
551551
self.assertTrue(_interpreters.is_running(interp))
552552

553553

554+
class CommonTests(TestBase):
555+
def setUp(self):
556+
super().setUp()
557+
self.id = _interpreters.create()
558+
559+
def test_signatures(self):
560+
# for method in ['exec', 'run_string', 'run_func']:
561+
msg = "expected 'shared' to be a dict"
562+
with self.assertRaisesRegex(TypeError, msg):
563+
_interpreters.exec(self.id, 'a', 1)
564+
with self.assertRaisesRegex(TypeError, msg):
565+
_interpreters.exec(self.id, 'a', shared=1)
566+
with self.assertRaisesRegex(TypeError, msg):
567+
_interpreters.run_string(self.id, 'a', shared=1)
568+
with self.assertRaisesRegex(TypeError, msg):
569+
_interpreters.run_func(self.id, lambda: None, shared=1)
570+
571+
554572
class RunStringTests(TestBase):
555573

556574
def setUp(self):
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix crash when non-dict was passed to several functions in ``_interpreters``
2+
module.

Modules/_interpretersmodule.c

+5
Original file line numberDiff line numberDiff line change
@@ -936,6 +936,11 @@ static int
936936
_interp_exec(PyObject *self, PyInterpreterState *interp,
937937
PyObject *code_arg, PyObject *shared_arg, PyObject **p_excinfo)
938938
{
939+
if (shared_arg != NULL && !PyDict_CheckExact(shared_arg)) {
940+
PyErr_SetString(PyExc_TypeError, "expected 'shared' to be a dict");
941+
return -1;
942+
}
943+
939944
// Extract code.
940945
Py_ssize_t codestrlen = -1;
941946
PyObject *bytes_obj = NULL;

0 commit comments

Comments
 (0)