diff --git a/Lib/test/test_interpreters/test_api.py b/Lib/test/test_interpreters/test_api.py index aac3cdd717668c..b216595e99ac80 100644 --- a/Lib/test/test_interpreters/test_api.py +++ b/Lib/test/test_interpreters/test_api.py @@ -2071,6 +2071,10 @@ def test_new_config(self): with self.subTest(f'bad override (gil={value!r})'): with self.assertRaises(ValueError): _interpreters.new_config(gil=value) + with self.subTest('bad override (gil=lone surrogate)'): + # gh-156117: a lone surrogate cannot be encoded as UTF-8 + with self.assertRaises(UnicodeEncodeError): + _interpreters.new_config(gil='\ud800') def test_get_main(self): interpid, whence = _interpreters.get_main() diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-08-21-01-10-18.gh-issue-156117.MEgefB.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-08-21-01-10-18.gh-issue-156117.MEgefB.rst new file mode 100644 index 00000000000000..fd1867e08c908d --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2026-08-21-01-10-18.gh-issue-156117.MEgefB.rst @@ -0,0 +1,2 @@ +Fix a crash in :func:`!_interpreters.new_config` +when the ``gil`` argument cannot be encoded as UTF-8. diff --git a/Python/interpconfig.c b/Python/interpconfig.c index a37bd3f5b23a01..9ff28f88134318 100644 --- a/Python/interpconfig.c +++ b/Python/interpconfig.c @@ -133,7 +133,12 @@ _config_dict_copy_str(PyObject *dict, const char *name, config_dict_invalid_type(name); return -1; } - strncpy(buf, PyUnicode_AsUTF8(item), bufsize-1); + const char *str = PyUnicode_AsUTF8(item); + if (str == NULL) { + Py_DECREF(item); + return -1; + } + strncpy(buf, str, bufsize-1); buf[bufsize-1] = '\0'; Py_DECREF(item); return 0;