From b3ffa8aeff157a6af19e0028b9118508bf973787 Mon Sep 17 00:00:00 2001 From: Thomas Kowalski Date: Mon, 8 Jun 2026 20:31:54 +0200 Subject: [PATCH] gh-150633: Properly handle null characters in the name when importing frozen modules (GH-150634) (cherry picked from commit 54de5475cd753e2519692c3e54af0f150e0a8b62) Co-authored-by: Thomas Kowalski --- Lib/test/test_import/__init__.py | 9 +++++++++ .../2026-05-30-20-19-35.gh-issue-150633.XkNul0.rst | 3 +++ Python/import.c | 2 +- 3 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-05-30-20-19-35.gh-issue-150633.XkNul0.rst diff --git a/Lib/test/test_import/__init__.py b/Lib/test/test_import/__init__.py index 4d2c263bebd272..4eb1deaf348bbb 100644 --- a/Lib/test/test_import/__init__.py +++ b/Lib/test/test_import/__init__.py @@ -379,6 +379,15 @@ def test_import_raises_ModuleNotFoundError(self): with self.assertRaises(ModuleNotFoundError): import something_that_should_not_exist_anywhere + def test_import_null_byte_in_name_raises_ModuleNotFoundError(self): + # gh-150633: module names containing null bytes should not + # lead to duplicates in sys.modules + before = set(sys.modules.keys()) + with self.assertRaises(ModuleNotFoundError): + __import__('zipimport\x00junk') + + self.assertEqual(set(sys.modules.keys()), before) + def test_from_import_missing_module_raises_ModuleNotFoundError(self): with self.assertRaises(ModuleNotFoundError): from something_that_should_not_exist_anywhere import blah diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-05-30-20-19-35.gh-issue-150633.XkNul0.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-05-30-20-19-35.gh-issue-150633.XkNul0.rst new file mode 100644 index 00000000000000..c397ad61f086c1 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2026-05-30-20-19-35.gh-issue-150633.XkNul0.rst @@ -0,0 +1,3 @@ +Fix the frozen importer accepting module names with embedded null bytes, which +caused it to bypass the :data:`sys.modules` cache and create duplicate module +objects. diff --git a/Python/import.c b/Python/import.c index d5d3b79357664b..44d0e5420cfe02 100644 --- a/Python/import.c +++ b/Python/import.c @@ -2986,7 +2986,7 @@ find_frozen(PyObject *nameobj, struct frozen_info *info) if (nameobj == NULL || nameobj == Py_None) { return FROZEN_BAD_NAME; } - const char *name = PyUnicode_AsUTF8(nameobj); + const char *name = _PyUnicode_AsUTF8NoNUL(nameobj); if (name == NULL) { // Note that this function previously used // _PyUnicode_EqualToASCIIString(). We clear the error here