summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_imp.py34
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2022-10-19-18-03-28.gh-issue-98354.GRGta3.rst1
-rw-r--r--Python/import.c8
3 files changed, 43 insertions, 0 deletions
diff --git a/Lib/test/test_imp.py b/Lib/test/test_imp.py
index 35b6afa..446e913 100644
--- a/Lib/test/test_imp.py
+++ b/Lib/test/test_imp.py
@@ -378,6 +378,40 @@ class ImportTests(unittest.TestCase):
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 0000000..a600f3e
--- /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 698ef37..9d35d26 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;