cpython: 32de35f0f877 (original) (raw)
--- a/Lib/test/test_zipfile.py +++ b/Lib/test/test_zipfile.py @@ -760,6 +760,20 @@ class OtherTests(unittest.TestCase): chk = zipfile.is_zipfile(fp) self.assertTrue(not chk)
- def test_damaged_zipfile(self):
"""Check that zipfiles with missing bytes at the end raise BadZipFile."""[](#l1.8)
# - Create a valid zip file[](#l1.9)
fp = io.BytesIO()[](#l1.10)
with zipfile.ZipFile(fp, mode="w") as zipf:[](#l1.11)
zipf.writestr("foo.txt", b"O, for a Muse of Fire!")[](#l1.12)
zipfiledata = fp.getvalue()[](#l1.13)
# - Now create copies of it missing the last N bytes and make sure[](#l1.15)
# a BadZipFile exception is raised when we try to open it[](#l1.16)
for N in range(len(zipfiledata)):[](#l1.17)
fp = io.BytesIO(zipfiledata[:N])[](#l1.18)
self.assertRaises(zipfile.BadZipfile, zipfile.ZipFile, fp)[](#l1.19)
+ def test_is_zip_valid_file(self): """Check that is_zipfile() correctly identifies zip files.""" # - passing a filename
--- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -166,6 +166,8 @@ def _EndRecData64(fpin, offset, endrec): return endrec data = fpin.read(sizeEndCentDir64Locator)
- if len(data) != sizeEndCentDir64Locator:
sig, diskno, reloff, disks = struct.unpack(structEndArchive64Locator, data) if sig != stringEndArchive64Locator: return endrecreturn endrec[](#l2.8)
@@ -176,6 +178,8 @@ def _EndRecData64(fpin, offset, endrec): # Assume no 'zip64 extensible data' fpin.seek(offset - sizeEndCentDir64Locator - sizeEndCentDir64, 2) data = fpin.read(sizeEndCentDir64)
- if len(data) != sizeEndCentDir64:
sig, sz, create_version, read_version, disk_num, disk_dir, [](#l2.18) dircount, dircount2, dirsize, diroffset = [](#l2.19) struct.unpack(structEndArchive64, data)return endrec[](#l2.17)
@@ -211,7 +215,9 @@ def _EndRecData(fpin): except IOError: return None data = fpin.read()
- if (len(data) == sizeEndCentDir and
data[0:4] == stringEndArchive and[](#l2.27)
data[-2:] == b"\000\000"):[](#l2.28) # the signature is correct and there's no comment, unpack structure[](#l2.29) endrec = struct.unpack(structEndArchive, data)[](#l2.30) endrec=list(endrec)[](#l2.31)
@@ -235,6 +241,9 @@ def _EndRecData(fpin): if start >= 0: # found the magic number; attempt to unpack and interpret recData = data[start:start+sizeEndCentDir]
if len(recData) != sizeEndCentDir:[](#l2.36)
# Zip file is corrupted.[](#l2.37)
return None[](#l2.38) endrec = list(struct.unpack(structEndArchive, recData))[](#l2.39) commentSize = endrec[_ECD_COMMENT_SIZE] #as claimed by the zip file[](#l2.40) comment = data[start+sizeEndCentDir:start+sizeEndCentDir+commentSize][](#l2.41)
@@ -246,7 +255,7 @@ def _EndRecData(fpin): endrec) # Unable to find a valid end of central directory structure
class ZipInfo (object): @@ -818,9 +827,11 @@ class ZipFile(object): total = 0 while total < size_cd: centdir = fp.read(sizeCentralDir)
if centdir[0:4] != stringCentralDir:[](#l2.55)
raise BadZipfile, "Bad magic number for central directory"[](#l2.56)
if len(centdir) != sizeCentralDir:[](#l2.57)
raise BadZipfile("Truncated central directory")[](#l2.58) centdir = struct.unpack(structCentralDir, centdir)[](#l2.59)
if centdir[_CD_SIGNATURE] != stringCentralDir:[](#l2.60)
raise BadZipfile("Bad magic number for central directory")[](#l2.61) if self.debug > 2:[](#l2.62) print centdir[](#l2.63) filename = fp.read(centdir[_CD_FILENAME_LENGTH])[](#l2.64)
@@ -948,10 +959,12 @@ class ZipFile(object): # Skip the file header: fheader = zef_file.read(sizeFileHeader)
if fheader[0:4] != stringFileHeader:[](#l2.69)
raise BadZipfile, "Bad magic number for file header"[](#l2.70)
if len(fheader) != sizeFileHeader:[](#l2.71)
raise BadZipfile("Truncated file header")[](#l2.72)
fheader = struct.unpack(structFileHeader, fheader)[](#l2.73)
if fheader[_FH_SIGNATURE] != stringFileHeader:[](#l2.74)
raise BadZipfile("Bad magic number for file header")[](#l2.75)
fheader = struct.unpack(structFileHeader, fheader)[](#l2.77) fname = zef_file.read(fheader[_FH_FILENAME_LENGTH])[](#l2.78) if fheader[_FH_EXTRA_FIELD_LENGTH]:[](#l2.79) zef_file.read(fheader[_FH_EXTRA_FIELD_LENGTH])[](#l2.80)
--- a/Misc/NEWS +++ b/Misc/NEWS @@ -202,6 +202,10 @@ Core and Builtins Library ------- +- Issue #4844: ZipFile now raises BadZipfile when opens a ZIP file with an