From 70671267c11c562c6ca682eebf863616b258c20a Mon Sep 17 00:00:00 2001 From: dr-carlos <77367421+dr-carlos@users.noreply.github.com> Date: Wed, 10 Dec 2025 17:01:57 +1030 Subject: [PATCH] gh-142029: Raise `ValueError` instead of crashing on empty name given to `create_builtin()` (#142033) Co-authored-by: Victor Stinner --- Lib/test/test_import/__init__.py | 14 ++++++++++++++ .../2025-11-28-16-45-07.gh-issue-142029.JuXiKu.rst | 2 ++ Python/import.c | 6 ++++++ 3 files changed, 22 insertions(+) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-11-28-16-45-07.gh-issue-142029.JuXiKu.rst diff --git a/Lib/test/test_import/__init__.py b/Lib/test/test_import/__init__.py index 271361ae8164..fa4f5e013d4b 100644 --- a/Lib/test/test_import/__init__.py +++ b/Lib/test/test_import/__init__.py @@ -1253,6 +1253,20 @@ os.does_not_exist origin = "a\x00b" _imp.create_dynamic(Spec2()) + def test_create_builtin(self): + class Spec: + name = None + spec = Spec() + + with self.assertRaisesRegex(TypeError, 'name must be string, not NoneType'): + _imp.create_builtin(spec) + + spec.name = "" + + # gh-142029 + with self.assertRaisesRegex(ValueError, 'name must not be empty'): + _imp.create_builtin(spec) + def test_filter_syntax_warnings_by_module(self): module_re = r'test\.test_import\.data\.syntax_warnings\z' unload('test.test_import.data.syntax_warnings') diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-28-16-45-07.gh-issue-142029.JuXiKu.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-28-16-45-07.gh-issue-142029.JuXiKu.rst new file mode 100644 index 000000000000..b4cd284804de --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-28-16-45-07.gh-issue-142029.JuXiKu.rst @@ -0,0 +1,2 @@ +Raise :exc:`ValueError` instead of crashing when empty string is used as a name +in ``_imp.create_builtin()``. diff --git a/Python/import.c b/Python/import.c index e91c95b40d94..4dd247fac276 100644 --- a/Python/import.c +++ b/Python/import.c @@ -4420,6 +4420,12 @@ _imp_create_builtin(PyObject *module, PyObject *spec) return NULL; } + if (PyUnicode_GetLength(name) == 0) { + PyErr_Format(PyExc_ValueError, "name must not be empty"); + Py_DECREF(name); + return NULL; + } + PyObject *mod = create_builtin(tstate, name, spec, NULL); Py_DECREF(name); return mod; -- 2.47.3