[3.6] bpo-31315: Fix an assertion failure in imp.create_dynamic(), wh… · python/cpython@99a51d4

File tree

3 files changed

lines changed

  • Misc/NEWS.d/next/Core and Builtins

3 files changed

lines changed

Original file line numberDiff line numberDiff line change

@@ -318,6 +318,17 @@ def test_load_source(self):

318318

with self.assertRaisesRegex(ValueError, 'embedded null'):

319319

imp.load_source(__name__, __file__ + "\0")

320320
321+

@support.cpython_only

322+

def test_issue31315(self):

323+

# There shouldn't be an assertion failure in imp.create_dynamic(),

324+

# when spec.name is not a string.

325+

create_dynamic = support.get_attribute(imp, 'create_dynamic')

326+

class BadSpec:

327+

name = None

328+

origin = 'foo'

329+

with self.assertRaises(TypeError):

330+

create_dynamic(BadSpec())

331+
321332
322333

class ReloadTests(unittest.TestCase):

323334
Original file line numberDiff line numberDiff line change

@@ -0,0 +1,2 @@

1+

Fix an assertion failure in imp.create_dynamic(), when spec.name is not a

2+

string. Patch by Oren Milman.

Original file line numberDiff line numberDiff line change

@@ -103,6 +103,11 @@ _PyImport_LoadDynamicModuleWithSpec(PyObject *spec, FILE *fp)

103103

if (name_unicode == NULL) {

104104

return NULL;

105105

}

106+

if (!PyUnicode_Check(name_unicode)) {

107+

PyErr_SetString(PyExc_TypeError,

108+

"spec.name must be a string");

109+

goto error;

110+

}

106111
107112

name = get_encoded_name(name_unicode, &hook_prefix);

108113

if (name == NULL) {