[Python-checkins] gh-98354: Add unicode check for 'name' attribute in _imp_create_builtin (GH-98412)

miss-islington webhook-mailer at python.org
Wed Oct 19 20:25:16 EDT 2022


https://github.com/python/cpython/commit/1f369ad07ff44b1fd6db75b33298e20ad604efc8
commit: 1f369ad07ff44b1fd6db75b33298e20ad604efc8
branch: main
author: chgnrdv <52372310+chgnrdv at users.noreply.github.com>
committer: miss-islington <31488909+miss-islington at users.noreply.github.com>
date: 2022-10-19T17:25:10-07:00
summary:

gh-98354: Add unicode check for 'name' attribute in _imp_create_builtin (GH-98412)



Fixes #98354

files:
A Misc/NEWS.d/next/Core and Builtins/2022-10-19-18-03-28.gh-issue-98354.GRGta3.rst
M Lib/test/test_imp.py
M Python/import.c

diff --git a/Lib/test/test_imp.py b/Lib/test/test_imp.py
index 35b6afa91ebd..446e913e5bf3 100644
--- a/Lib/test/test_imp.py
+++ b/Lib/test/test_imp.py
@@ -378,6 +378,40 @@ def test_find_and_load_checked_pyc(self):
             mod = imp.load_module('mymod', file, path, description)
         self.assertEqual(mod.x, 42)
 
+    def test_issue98354(self):
+        # _imp.create_builtin should raise TypeError
+        # if 'name' attribute of 'spec' argument is not a 'str' instance
+
+        create_builtin = support.get_attribute(_imp, "create_builtin")
+
+        class FakeSpec:
+            def __init__(self, name):
+                self.name = self
+        spec = FakeSpec("time")
+        with self.assertRaises(TypeError):
+            create_builtin(spec)
+
+        class FakeSpec2:
+            name = [1, 2, 3, 4]
+        spec = FakeSpec2()
+        with self.assertRaises(TypeError):
+            create_builtin(spec)
+
+        import builtins
+        class UnicodeSubclass(str):
+            pass
+        class GoodSpec:
+            name = UnicodeSubclass("builtins")
+        spec = GoodSpec()
+        bltin = create_builtin(spec)
+        self.assertEqual(bltin, builtins)
+
+        class UnicodeSubclassFakeSpec(str):
+            def __init__(self, name):
+                self.name = self
+        spec = UnicodeSubclassFakeSpec("builtins")
+        bltin = create_builtin(spec)
+        self.assertEqual(bltin, builtins)
 
 class ReloadTests(unittest.TestCase):
 
diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-10-19-18-03-28.gh-issue-98354.GRGta3.rst b/Misc/NEWS.d/next/Core and Builtins/2022-10-19-18-03-28.gh-issue-98354.GRGta3.rst
new file mode 100644
index 000000000000..a600f3e927a3
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2022-10-19-18-03-28.gh-issue-98354.GRGta3.rst	
@@ -0,0 +1 @@
+Added unicode check for ``name`` attribute of ``spec`` argument passed in :func:`_imp.create_builtin` function.
diff --git a/Python/import.c b/Python/import.c
index 698ef37ce0a1..9d35d2617742 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -1021,6 +1021,14 @@ _imp_create_builtin(PyObject *module, PyObject *spec)
         return NULL;
     }
 
+    if (!PyUnicode_Check(name)) {
+        PyErr_Format(PyExc_TypeError,
+                     "name must be string, not %.200s",
+                     Py_TYPE(name)->tp_name);
+        Py_DECREF(name);
+        return NULL;
+    }
+
     PyObject *mod = create_builtin(tstate, name, spec);
     Py_DECREF(name);
     return mod;



More information about the Python-checkins mailing list