Skip to content

Commit e194b21

Browse files
[3.13] gh-126654: Fix crash in several functions in _interpreters module (GH-126678) (#126681)
gh-126654: Fix crash in several functions in `_interpreters` module (GH-126678) (cherry picked from commit 9fc2808) Co-authored-by: sobolevn <[email protected]>
1 parent 90cf1af commit e194b21

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
@@ -939,6 +939,11 @@ static int
939939
_interp_exec(PyObject *self, PyInterpreterState *interp,
940940
PyObject *code_arg, PyObject *shared_arg, PyObject **p_excinfo)
941941
{
942+
if (shared_arg != NULL && !PyDict_CheckExact(shared_arg)) {
943+
PyErr_SetString(PyExc_TypeError, "expected 'shared' to be a dict");
944+
return -1;
945+
}
946+
942947
// Extract code.
943948
Py_ssize_t codestrlen = -1;
944949
PyObject *bytes_obj = NULL;

0 commit comments

Comments
 (0)