From 1f369ad07ff44b1fd6db75b33298e20ad604efc8 Mon Sep 17 00:00:00 2001 From: chgnrdv <52372310+chgnrdv@users.noreply.github.com> Date: Thu, 20 Oct 2022 03:25:10 +0300 Subject: [PATCH] gh-98354: Add unicode check for 'name' attribute in _imp_create_builtin (GH-98412) Fixes #98354 --- Lib/test/test_imp.py | 34 +++++++++++++++++++ ...2-10-19-18-03-28.gh-issue-98354.GRGta3.rst | 1 + Python/import.c | 8 +++++ 3 files changed, 43 insertions(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2022-10-19-18-03-28.gh-issue-98354.GRGta3.rst diff --git a/Lib/test/test_imp.py b/Lib/test/test_imp.py index 35b6afa91ebd4f..446e913e5bf383 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 00000000000000..a600f3e927a315 --- /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 698ef37ce0a131..9d35d261774211 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;