Kaydet (Commit) db60a5bf authored tarafından Oren Milman's avatar Oren Milman Kaydeden (comit) Brett Cannon

bpo-31781: Prevent crashes when calling methods of an uninitialized…

bpo-31781: Prevent crashes when calling methods of an uninitialized zipimport.zipimporter object (GH-3986)
üst 56cb465c
...@@ -668,6 +668,20 @@ class UncompressedZipImportTestCase(ImportHooksBaseTestCase): ...@@ -668,6 +668,20 @@ class UncompressedZipImportTestCase(ImportHooksBaseTestCase):
with self.assertWarns(DeprecationWarning): with self.assertWarns(DeprecationWarning):
zipimport.zipimporter(memoryview(os.fsencode(filename))) 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 @support.requires_zlib
class CompressedZipImportTestCase(UncompressedZipImportTestCase): class CompressedZipImportTestCase(UncompressedZipImportTestCase):
......
Prevent crashes when calling methods of an uninitialized
``zipimport.zipimporter`` object. Patch by Oren Milman.
...@@ -322,6 +322,12 @@ get_module_info(ZipImporter *self, PyObject *fullname) ...@@ -322,6 +322,12 @@ get_module_info(ZipImporter *self, PyObject *fullname)
PyObject *path, *fullpath, *item; PyObject *path, *fullpath, *item;
struct st_zip_searchorder *zso; 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); subname = get_subname(fullname);
if (subname == NULL) if (subname == NULL)
return MI_ERROR; return MI_ERROR;
...@@ -652,6 +658,12 @@ zipimport_zipimporter_get_data_impl(ZipImporter *self, PyObject *path) ...@@ -652,6 +658,12 @@ zipimport_zipimporter_get_data_impl(ZipImporter *self, PyObject *path)
PyObject *toc_entry; PyObject *toc_entry;
Py_ssize_t path_start, path_len, len; 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 #ifdef ALTSEP
path = _PyObject_CallMethodId((PyObject *)&PyUnicode_Type, &PyId_replace, path = _PyObject_CallMethodId((PyObject *)&PyUnicode_Type, &PyId_replace,
"OCC", path, ALTSEP, SEP); "OCC", path, ALTSEP, SEP);
...@@ -1476,6 +1488,12 @@ get_module_code(ZipImporter *self, PyObject *fullname, ...@@ -1476,6 +1488,12 @@ get_module_code(ZipImporter *self, PyObject *fullname,
PyObject *path, *fullpath = NULL; PyObject *path, *fullpath = NULL;
struct st_zip_searchorder *zso; struct st_zip_searchorder *zso;
if (self->prefix == NULL) {
PyErr_SetString(PyExc_ValueError,
"zipimporter.__init__() wasn't called");
return NULL;
}
subname = get_subname(fullname); subname = get_subname(fullname);
if (subname == NULL) if (subname == NULL)
return NULL; return NULL;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment