mirror of
https://github.com/python/cpython.git
synced 2025-09-03 23:41:18 +00:00
gh-98354: Add unicode check for 'name' attribute in _imp_create_builtin (GH-98412)
Fixes #98354
This commit is contained in:
parent
a8fe4bbd6b
commit
1f369ad07f
3 changed files with 43 additions and 0 deletions
|
@ -378,6 +378,40 @@ class ImportTests(unittest.TestCase):
|
||||||
mod = imp.load_module('mymod', file, path, description)
|
mod = imp.load_module('mymod', file, path, description)
|
||||||
self.assertEqual(mod.x, 42)
|
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):
|
class ReloadTests(unittest.TestCase):
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Added unicode check for ``name`` attribute of ``spec`` argument passed in :func:`_imp.create_builtin` function.
|
|
@ -1021,6 +1021,14 @@ _imp_create_builtin(PyObject *module, PyObject *spec)
|
||||||
return NULL;
|
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);
|
PyObject *mod = create_builtin(tstate, name, spec);
|
||||||
Py_DECREF(name);
|
Py_DECREF(name);
|
||||||
return mod;
|
return mod;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue