Skip to content

Commit 77e0eb2

Browse files
committed
gh-158494: zipimport: raise ZipImportError for corrupt deflate data
1 parent 77c0675 commit 77e0eb2

3 files changed

Lines changed: 29 additions & 1 deletion

File tree

‎Lib/test/test_zipimport.py‎

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1021,6 +1021,29 @@ def assertDataEntry(name):
10211021
class DeflateCompressedZipImportTestCase(UncompressedZipImportTestCase):
10221022
compression = ZIP_DEFLATED
10231023

1024+
def testCorruptDeflateDataRaisesZipImportError(self):
1025+
# gh-158494: a corrupt deflate stream in a .pyc must surface as.
1026+
# ZipImportError, not zlib.error.
1027+
files = {TESTMOD + pyc_ext: test_pyc}
1028+
self.makeZip(files)
1029+
1030+
# Corrupt the deflate stream of the .pyc entry in place.
1031+
with open(TEMP_ZIP, "r+b") as f:
1032+
data = f.read()
1033+
idx = data.find((TESTMOD + pyc_ext).encode())
1034+
lh = data.rfind(b"PK\x03\x04")
1035+
name_len, extra_len = struct.unpack_from("<HH", data, lh + 26)
1036+
data_start = lh + 30 + name_len + extra_len
1037+
f.seek(data_start)
1038+
f.write(b"\xff" * 8)
1039+
1040+
zipimport._zip_directory_cache.clear()
1041+
sys.path.insert(0, TEMP_ZIP)
1042+
self.addCleanup(sys.modules.pop, TESTMOD, None)
1043+
importlib.invalidate_caches()
1044+
1045+
with self.assertRaises(zipimport.ZipImportError):
1046+
importlib.import_module(TESTMOD)
10241047

10251048
@support.requires_zstd()
10261049
class ZStdCompressedZipImportTestCase(UncompressedZipImportTestCase):

‎Lib/zipimport.py‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -668,7 +668,10 @@ def _get_data(archive, toc_entry):
668668
decompress = _get_zlib_decompress_func()
669669
except Exception:
670670
raise ZipImportError("can't decompress data; zlib not available")
671-
return decompress(raw_data, -15)
671+
try:
672+
return decompress(raw_data, -15)
673+
except Exception:
674+
raise ZipImportError("could not decompress deflate data")
672675
case 93: # zstd
673676
try:
674677
return _zstd_decompress(raw_data)
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix :mod:`zipimport` to raise :exc:`zipimport.ZipImportError` instead of
2+
leaking :exc:`zlib.error` when a zip entry's deflate stream is corrupt.

0 commit comments

Comments
 (0)