From 46bfd26fb294a8769ef6d0c056ee6c9df022a037 Mon Sep 17 00:00:00 2001 From: Peter Bierma Date: Sun, 1 Dec 2024 01:33:23 -0500 Subject: [PATCH] gh-127165: Disallow embedded NULL characters in `_interpreters` (#127199) --- Lib/test/test_interpreters/test_api.py | 4 ++++ Python/crossinterp.c | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/Lib/test/test_interpreters/test_api.py b/Lib/test/test_interpreters/test_api.py index a9befbba64daa0..01856d9bf67657 100644 --- a/Lib/test/test_interpreters/test_api.py +++ b/Lib/test/test_interpreters/test_api.py @@ -1649,6 +1649,10 @@ def test_set___main___attrs(self): self.assertIs(after2, None) self.assertEqual(after3.type.__name__, 'AssertionError') + with self.assertRaises(ValueError): + # GH-127165: Embedded NULL characters broke the lookup + _interpreters.set___main___attrs(interpid, {"\x00": 1}) + with self.subTest('from C-API'): with self.interpreter_from_capi() as interpid: with self.assertRaisesRegex(InterpreterError, 'unrecognized'): diff --git a/Python/crossinterp.c b/Python/crossinterp.c index 7aaa045f375cf0..0a106ad636bfe8 100644 --- a/Python/crossinterp.c +++ b/Python/crossinterp.c @@ -342,6 +342,11 @@ _copy_string_obj_raw(PyObject *strobj, Py_ssize_t *p_size) return NULL; } + if (size != (Py_ssize_t)strlen(str)) { + PyErr_SetString(PyExc_ValueError, "found embedded NULL character"); + return NULL; + } + char *copied = PyMem_RawMalloc(size+1); if (copied == NULL) { PyErr_NoMemory();