summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOren Milman <orenmn@gmail.com>2017-08-29 17:40:15 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2017-08-29 17:40:15 (GMT)
commit631fdee6e61b4ba8ce800f827fecdd536bfb04f3 (patch)
tree739bc09153527ad7bde3f5c98587cc13c2353080
parent006617ff7d6df3fdedcfe53e94ee2c52cc796437 (diff)
downloadcpython-631fdee6e61b4ba8ce800f827fecdd536bfb04f3.zip
cpython-631fdee6e61b4ba8ce800f827fecdd536bfb04f3.tar.gz
cpython-631fdee6e61b4ba8ce800f827fecdd536bfb04f3.tar.bz2
bpo-31291: Fixed an assertion failure in zipimport.zipimporter.get_data() (#3226)
if pathname.replace('/', '\\') returns non-string.
-rw-r--r--Lib/test/test_zipimport.py17
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2017-08-28-11-51-29.bpo-31291.t8QggK.rst3
-rw-r--r--Modules/zipimport.c3
3 files changed, 22 insertions, 1 deletions
diff --git a/Lib/test/test_zipimport.py b/Lib/test/test_zipimport.py
index 7ddbc50..daa5138 100644
--- a/Lib/test/test_zipimport.py
+++ b/Lib/test/test_zipimport.py
@@ -521,6 +521,23 @@ class UncompressedZipImportTestCase(ImportHooksBaseTestCase):
z.close()
os.remove(TEMP_ZIP)
+ def test_issue31291(self):
+ # There shouldn't be an assertion failure in get_data().
+ class FunnyStr(str):
+ def replace(self, old, new):
+ return 42
+ z = ZipFile(TEMP_ZIP, "w")
+ try:
+ name = "test31291.dat"
+ data = b'foo'
+ z.writestr(name, data)
+ z.close()
+ zi = zipimport.zipimporter(TEMP_ZIP)
+ self.assertEqual(data, zi.get_data(FunnyStr(name)))
+ finally:
+ z.close()
+ os.remove(TEMP_ZIP)
+
def testImporterAttr(self):
src = """if 1: # indent hack
def get_file():
diff --git a/Misc/NEWS.d/next/Core and Builtins/2017-08-28-11-51-29.bpo-31291.t8QggK.rst b/Misc/NEWS.d/next/Core and Builtins/2017-08-28-11-51-29.bpo-31291.t8QggK.rst
new file mode 100644
index 0000000..0576785
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2017-08-28-11-51-29.bpo-31291.t8QggK.rst
@@ -0,0 +1,3 @@
+Fix an assertion failure in `zipimport.zipimporter.get_data` on Windows,
+when the return value of ``pathname.replace('/','\\')`` isn't a string.
+Patch by Oren Milman.
diff --git a/Modules/zipimport.c b/Modules/zipimport.c
index c01ee55..d710360 100644
--- a/Modules/zipimport.c
+++ b/Modules/zipimport.c
@@ -651,7 +651,8 @@ zipimport_zipimporter_get_data_impl(ZipImporter *self, PyObject *path)
Py_ssize_t path_start, path_len, len;
#ifdef ALTSEP
- path = _PyObject_CallMethodId(path, &PyId_replace, "CC", ALTSEP, SEP);
+ path = _PyObject_CallMethodId((PyObject *)&PyUnicode_Type, &PyId_replace,
+ "OCC", path, ALTSEP, SEP);
if (!path)
return NULL;
#else