[Python-checkins] bpo-31315: Fix an assertion failure in imp.create_dynamic(), when spec.name is not a string. (#3257)
Serhiy Storchaka
webhook-mailer at python.org
Tue Sep 19 07:39:50 EDT 2017
https://github.com/python/cpython/commit/9974e1bcf3d0cec9b38b39b39b7ec8a1ebd9ef54
commit: 9974e1bcf3d0cec9b38b39b39b7ec8a1ebd9ef54
branch: master
author: Oren Milman <orenmn at gmail.com>
committer: Serhiy Storchaka <storchaka at gmail.com>
date: 2017-09-19T14:39:47+03:00
summary:
bpo-31315: Fix an assertion failure in imp.create_dynamic(), when spec.name is not a string. (#3257)
files:
A Misc/NEWS.d/next/Core and Builtins/2017-09-01-00-40-58.bpo-31315.ZX20bl.rst
M Lib/test/test_imp.py
M Python/importdl.c
diff --git a/Lib/test/test_imp.py b/Lib/test/test_imp.py
index 3bfcb095894..51bec50cc2f 100644
--- a/Lib/test/test_imp.py
+++ b/Lib/test/test_imp.py
@@ -313,6 +313,17 @@ def test_load_source(self):
with self.assertRaisesRegex(ValueError, 'embedded null'):
imp.load_source(__name__, __file__ + "\0")
+ @support.cpython_only
+ def test_issue31315(self):
+ # There shouldn't be an assertion failure in imp.create_dynamic(),
+ # when spec.name is not a string.
+ create_dynamic = support.get_attribute(imp, 'create_dynamic')
+ class BadSpec:
+ name = None
+ origin = 'foo'
+ with self.assertRaises(TypeError):
+ create_dynamic(BadSpec())
+
class ReloadTests(unittest.TestCase):
diff --git a/Misc/NEWS.d/next/Core and Builtins/2017-09-01-00-40-58.bpo-31315.ZX20bl.rst b/Misc/NEWS.d/next/Core and Builtins/2017-09-01-00-40-58.bpo-31315.ZX20bl.rst
new file mode 100644
index 00000000000..d13badbb358
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2017-09-01-00-40-58.bpo-31315.ZX20bl.rst
@@ -0,0 +1,2 @@
+Fix an assertion failure in imp.create_dynamic(), when spec.name is not a
+string. Patch by Oren Milman.
diff --git a/Python/importdl.c b/Python/importdl.c
index 32fb7e1be21..50231ff2884 100644
--- a/Python/importdl.c
+++ b/Python/importdl.c
@@ -103,6 +103,11 @@ _PyImport_LoadDynamicModuleWithSpec(PyObject *spec, FILE *fp)
if (name_unicode == NULL) {
return NULL;
}
+ if (!PyUnicode_Check(name_unicode)) {
+ PyErr_SetString(PyExc_TypeError,
+ "spec.name must be a string");
+ goto error;
+ }
name = get_encoded_name(name_unicode, &hook_prefix);
if (name == NULL) {
More information about the Python-checkins
mailing list