mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
Issue #21866: ZipFile.close() no longer writes ZIP64 central directory
records if allowZip64 is false.
This commit is contained in:
parent
8aa8c47db2
commit
cfbb394488
3 changed files with 66 additions and 20 deletions
|
@ -50,7 +50,7 @@ error = BadZipfile = BadZipFile # Pre-3.2 compatibility names
|
|||
|
||||
|
||||
ZIP64_LIMIT = (1 << 31) - 1
|
||||
ZIP_FILECOUNT_LIMIT = 1 << 16
|
||||
ZIP_FILECOUNT_LIMIT = (1 << 16) - 1
|
||||
ZIP_MAX_COMMENT = (1 << 16) - 1
|
||||
|
||||
# constants for Zip file compression methods
|
||||
|
@ -1304,13 +1304,17 @@ class ZipFile:
|
|||
raise RuntimeError(
|
||||
"Attempt to write ZIP archive that was already closed")
|
||||
_check_compression(zinfo.compress_type)
|
||||
if zinfo.file_size > ZIP64_LIMIT:
|
||||
if not self._allowZip64:
|
||||
raise LargeZipFile("Filesize would require ZIP64 extensions")
|
||||
if zinfo.header_offset > ZIP64_LIMIT:
|
||||
if not self._allowZip64:
|
||||
raise LargeZipFile(
|
||||
"Zipfile size would require ZIP64 extensions")
|
||||
if not self._allowZip64:
|
||||
requires_zip64 = None
|
||||
if len(self.filelist) >= ZIP_FILECOUNT_LIMIT:
|
||||
requires_zip64 = "Files count"
|
||||
elif zinfo.file_size > ZIP64_LIMIT:
|
||||
requires_zip64 = "Filesize"
|
||||
elif zinfo.header_offset > ZIP64_LIMIT:
|
||||
requires_zip64 = "Zipfile size"
|
||||
if requires_zip64:
|
||||
raise LargeZipFile(requires_zip64 +
|
||||
" would require ZIP64 extensions")
|
||||
|
||||
def write(self, filename, arcname=None, compress_type=None):
|
||||
"""Put the bytes from filename into the archive under the name
|
||||
|
@ -1464,10 +1468,8 @@ class ZipFile:
|
|||
|
||||
try:
|
||||
if self.mode in ("w", "a") and self._didModify: # write ending records
|
||||
count = 0
|
||||
pos1 = self.fp.tell()
|
||||
for zinfo in self.filelist: # write central directory
|
||||
count = count + 1
|
||||
dt = zinfo.date_time
|
||||
dosdate = (dt[0] - 1980) << 9 | dt[1] << 5 | dt[2]
|
||||
dostime = dt[3] << 11 | dt[4] << 5 | (dt[5] // 2)
|
||||
|
@ -1531,13 +1533,21 @@ class ZipFile:
|
|||
|
||||
pos2 = self.fp.tell()
|
||||
# Write end-of-zip-archive record
|
||||
centDirCount = count
|
||||
centDirCount = len(self.filelist)
|
||||
centDirSize = pos2 - pos1
|
||||
centDirOffset = pos1
|
||||
if (centDirCount >= ZIP_FILECOUNT_LIMIT or
|
||||
centDirOffset > ZIP64_LIMIT or
|
||||
centDirSize > ZIP64_LIMIT):
|
||||
requires_zip64 = None
|
||||
if centDirCount > ZIP_FILECOUNT_LIMIT:
|
||||
requires_zip64 = "Files count"
|
||||
elif centDirOffset > ZIP64_LIMIT:
|
||||
requires_zip64 = "Central directory offset"
|
||||
elif centDirSize > ZIP64_LIMIT:
|
||||
requires_zip64 = "Central directory size"
|
||||
if requires_zip64:
|
||||
# Need to write the ZIP64 end-of-archive records
|
||||
if not self._allowZip64:
|
||||
raise LargeZipFile(requires_zip64 +
|
||||
" would require ZIP64 extensions")
|
||||
zip64endrec = struct.pack(
|
||||
structEndArchive64, stringEndArchive64,
|
||||
44, 45, 45, 0, 0, centDirCount, centDirCount,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue