[Python-checkins] r68662 - in python/branches/py3k: Lib/zipfile.py

amaury.forgeotdarc python-checkins at python.org
Sat Jan 17 17:42:27 CET 2009


Author: amaury.forgeotdarc
Date: Sat Jan 17 17:42:26 2009
New Revision: 68662
Log:
Merged revisions 68661 via svnmerge from 
svn+ssh://pythondev@svn.python.org/python/trunk
........
 r68661 | amaury.forgeotdarc | 2009年01月17日 17:40:17 +0100 (2009年1月17日) | 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
........
Modified:
 python/branches/py3k/ (props changed)
 python/branches/py3k/Lib/zipfile.py
Modified: python/branches/py3k/Lib/zipfile.py
==============================================================================
--- python/branches/py3k/Lib/zipfile.py	(original)
+++ python/branches/py3k/Lib/zipfile.py	Sat Jan 17 17:42:26 2009
@@ -28,7 +28,7 @@
 
 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 @@
 
 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 @@
 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()


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /