]> granicus.if.org Git - python/commitdiff
bpo-31781: Prevent crashes when calling methods of an uninitialized zipimport.zipimpo...
authorOren Milman <orenmn@gmail.com>
Fri, 20 Oct 2017 20:42:35 +0000 (23:42 +0300)
committerBrett Cannon <brettcannon@users.noreply.github.com>
Fri, 20 Oct 2017 20:42:35 +0000 (13:42 -0700)
Lib/test/test_zipimport.py
Misc/NEWS.d/next/Core and Builtins/2017-10-13-20-01-47.bpo-31781.cXE9SM.rst [new file with mode: 0644]
Modules/zipimport.c

index 4a934ff6cbdea3e1878a2997510eb8fa9bf31e17..67ca39b806648ef7c9962322a4c037e3dfbb8937 100644 (file)
@@ -668,6 +668,20 @@ class UncompressedZipImportTestCase(ImportHooksBaseTestCase):
         with self.assertWarns(DeprecationWarning):
             zipimport.zipimporter(memoryview(os.fsencode(filename)))
 
+    @support.cpython_only
+    def testUninitializedZipimporter(self):
+        # The interpreter shouldn't crash in case of calling methods of an
+        # uninitialized zipimport.zipimporter object.
+        zi = zipimport.zipimporter.__new__(zipimport.zipimporter)
+        self.assertRaises(ValueError, zi.find_module, 'foo')
+        self.assertRaises(ValueError, zi.find_loader, 'foo')
+        self.assertRaises(ValueError, zi.load_module, 'foo')
+        self.assertRaises(ValueError, zi.get_filename, 'foo')
+        self.assertRaises(ValueError, zi.is_package, 'foo')
+        self.assertRaises(ValueError, zi.get_data, 'foo')
+        self.assertRaises(ValueError, zi.get_code, 'foo')
+        self.assertRaises(ValueError, zi.get_source, 'foo')
+
 
 @support.requires_zlib
 class CompressedZipImportTestCase(UncompressedZipImportTestCase):
diff --git a/Misc/NEWS.d/next/Core and Builtins/2017-10-13-20-01-47.bpo-31781.cXE9SM.rst b/Misc/NEWS.d/next/Core and Builtins/2017-10-13-20-01-47.bpo-31781.cXE9SM.rst
new file mode 100644 (file)
index 0000000..79898cf
--- /dev/null
@@ -0,0 +1,2 @@
+Prevent crashes when calling methods of an uninitialized
+``zipimport.zipimporter`` object. Patch by Oren Milman.
index 895cd800fc47c10cebfad9b4fcbdd7c0eb623149..009480bac58d25f180dac121cff6bc4fcc2ce777 100644 (file)
@@ -322,6 +322,12 @@ get_module_info(ZipImporter *self, PyObject *fullname)
     PyObject *path, *fullpath, *item;
     struct st_zip_searchorder *zso;
 
+    if (self->prefix == NULL) {
+        PyErr_SetString(PyExc_ValueError,
+                        "zipimporter.__init__() wasn't called");
+        return MI_ERROR;
+    }
+
     subname = get_subname(fullname);
     if (subname == NULL)
         return MI_ERROR;
@@ -652,6 +658,12 @@ zipimport_zipimporter_get_data_impl(ZipImporter *self, PyObject *path)
     PyObject *toc_entry;
     Py_ssize_t path_start, path_len, len;
 
+    if (self->archive == NULL) {
+        PyErr_SetString(PyExc_ValueError,
+                        "zipimporter.__init__() wasn't called");
+        return NULL;
+    }
+
 #ifdef ALTSEP
     path = _PyObject_CallMethodId((PyObject *)&PyUnicode_Type, &PyId_replace,
                                   "OCC", path, ALTSEP, SEP);
@@ -1476,6 +1488,12 @@ get_module_code(ZipImporter *self, PyObject *fullname,
     PyObject *path, *fullpath = NULL;
     struct st_zip_searchorder *zso;
 
+    if (self->prefix == NULL) {
+        PyErr_SetString(PyExc_ValueError,
+                        "zipimporter.__init__() wasn't called");
+        return NULL;
+    }
+
     subname = get_subname(fullname);
     if (subname == NULL)
         return NULL;