diff options
author | Amaury Forgeot d'Arc <amauryfa@gmail.com> | 2009-01-17 16:42:26 (GMT) |
---|---|---|
committer | Amaury Forgeot d'Arc <amauryfa@gmail.com> | 2009-01-17 16:42:26 (GMT) |
commit | 0c3f8a4800a84f1887db7fcac6b65c1f8cedf43c (patch) | |
tree | e2d16dc4dd302e87464659059e6b7ec860778d32 /Lib/zipfile.py | |
parent | 0156dabadfa5b3fb98eccd597cd97e916978509c (diff) | |
download | cpython-0c3f8a4800a84f1887db7fcac6b65c1f8cedf43c.zip cpython-0c3f8a4800a84f1887db7fcac6b65c1f8cedf43c.tar.gz cpython-0c3f8a4800a84f1887db7fcac6b65c1f8cedf43c.tar.bz2 |
Merged revisions 68661 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r68661 | amaury.forgeotdarc | 2009-01-17 17:40:17 +0100 (Sat, 17 Jan 2009) | 5 lines
#3997: zipfiles generated with more than 65536 files could not be opened
with other applications.
Reviewed by Martin, will backport to 2.6 and 3.0
........
Diffstat (limited to 'Lib/zipfile.py')
-rw-r--r-- | Lib/zipfile.py | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/Lib/zipfile.py b/Lib/zipfile.py index 5054097..149f2a6 100644 --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -28,7 +28,7 @@ class LargeZipFile(Exception): error = BadZipfile # The exception raised by this module -ZIP64_LIMIT= (1 << 31) - 1 +ZIP64_LIMIT = (1 << 31) - 1 ZIP_FILECOUNT_LIMIT = 1 << 16 ZIP_MAX_COMMENT = (1 << 16) - 1 @@ -1198,19 +1198,26 @@ class ZipFile: pos2 = self.fp.tell() # Write end-of-zip-archive record + centDirCount = count + centDirSize = pos2 - pos1 centDirOffset = pos1 - if pos1 > ZIP64_LIMIT: + if (centDirCount >= ZIP_FILECOUNT_LIMIT or + centDirOffset > ZIP64_LIMIT or + centDirSize > ZIP64_LIMIT): # Need to write the ZIP64 end-of-archive records zip64endrec = struct.pack( structEndArchive64, stringEndArchive64, - 44, 45, 45, 0, 0, count, count, pos2 - pos1, pos1) + 44, 45, 45, 0, 0, centDirCount, centDirCount, + centDirSize, centDirOffset) self.fp.write(zip64endrec) zip64locrec = struct.pack( structEndArchive64Locator, stringEndArchive64Locator, 0, pos2, 1) self.fp.write(zip64locrec) - centDirOffset = 0xFFFFFFFF + centDirCount = min(centDirCount, 0xFFFF) + centDirSize = min(centDirSize, 0xFFFFFFFF) + centDirOffset = min(centDirOffset, 0xFFFFFFFF) # check for valid comment length if len(self.comment) >= ZIP_MAX_COMMENT: @@ -1220,9 +1227,8 @@ class ZipFile: self.comment = self.comment[:ZIP_MAX_COMMENT] endrec = struct.pack(structEndArchive, stringEndArchive, - 0, 0, count % ZIP_FILECOUNT_LIMIT, - count % ZIP_FILECOUNT_LIMIT, pos2 - pos1, - centDirOffset, len(self.comment)) + 0, 0, centDirCount, centDirCount, + centDirSize, centDirOffset, len(self.comment)) self.fp.write(endrec) self.fp.write(self.comment) self.fp.flush() |