[Python-checkins] r68663 - in python/branches/release26-maint: Lib/zipfile.py Misc/NEWS

amaury.forgeotdarc python-checkins at python.org
Sat Jan 17 17:46:36 CET 2009


Author: amaury.forgeotdarc
Date: Sat Jan 17 17:46:35 2009
New Revision: 68663

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 (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
........


Modified:
   python/branches/release26-maint/   (props changed)
   python/branches/release26-maint/Lib/zipfile.py
   python/branches/release26-maint/Misc/NEWS

Modified: python/branches/release26-maint/Lib/zipfile.py
==============================================================================
--- python/branches/release26-maint/Lib/zipfile.py	(original)
+++ python/branches/release26-maint/Lib/zipfile.py	Sat Jan 17 17:46:35 2009
@@ -26,7 +26,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
 
@@ -1175,19 +1175,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:
@@ -1197,9 +1204,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()

Modified: python/branches/release26-maint/Misc/NEWS
==============================================================================
--- python/branches/release26-maint/Misc/NEWS	(original)
+++ python/branches/release26-maint/Misc/NEWS	Sat Jan 17 17:46:35 2009
@@ -73,6 +73,9 @@
 Library
 -------
 
+- Issue #3997: zipfiles generated with more than 65536 files could not be
+  opened with other applications.
+
 - Issue 4816: itertools.combinations() and itertools.product were raising
   a ValueError for values of *r* larger than the input iterable.  They now
   correctly return an empty iterator.


More information about the Python-checkins mailing list