]> granicus.if.org Git - python/commitdiff
bpo-34472: Add data descriptor signature to zipfile (GH-8871)
authorSilas Sewell <silas@sewell.org>
Tue, 18 Sep 2018 17:00:05 +0000 (13:00 -0400)
committerSerhiy Storchaka <storchaka@gmail.com>
Tue, 18 Sep 2018 17:00:05 +0000 (20:00 +0300)
This makes streamed zips compatible with MacOS Archive Utility and
other applications.

Lib/zipfile.py
Misc/ACKS
Misc/NEWS.d/next/Library/2018-08-23-09-25-08.bpo-34472.cGyYrO.rst [new file with mode: 0644]

index 89df90b25209f830ba657c24ffd58888d82c59f9..4a6b40ee441c6fba3a65ca53f758008a308b57d7 100644 (file)
@@ -159,6 +159,8 @@ _CD64_NUMBER_ENTRIES_TOTAL = 7
 _CD64_DIRECTORY_SIZE = 8
 _CD64_OFFSET_START_CENTDIR = 9
 
+_DD_SIGNATURE = 0x08074b50
+
 _EXTRA_FIELD_STRUCT = struct.Struct('<HH')
 
 def _strip_extra(extra, xids):
@@ -1118,8 +1120,8 @@ class _ZipWriteFile(io.BufferedIOBase):
         # Write updated header info
         if self._zinfo.flag_bits & 0x08:
             # Write CRC and file sizes after the file data
-            fmt = '<LQQ' if self._zip64 else '<LLL'
-            self._fileobj.write(struct.pack(fmt, self._zinfo.CRC,
+            fmt = '<LLQQ' if self._zip64 else '<LLLL'
+            self._fileobj.write(struct.pack(fmt, _DD_SIGNATURE, self._zinfo.CRC,
                 self._zinfo.compress_size, self._zinfo.file_size))
             self._zipfile.start_dir = self._fileobj.tell()
         else:
index a29ff6020bbfc3977391a0def32d6cb369951c1d..96563f62a1a8600b50addd4df8c914790cc19612 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -1468,6 +1468,7 @@ Roger D. Serwy
 Jerry Seutter
 Pete Sevander
 Denis Severson
+Silas Sewell
 Ian Seyer
 Dmitry Shachnev
 Anish Shah
diff --git a/Misc/NEWS.d/next/Library/2018-08-23-09-25-08.bpo-34472.cGyYrO.rst b/Misc/NEWS.d/next/Library/2018-08-23-09-25-08.bpo-34472.cGyYrO.rst
new file mode 100644 (file)
index 0000000..208ec0b
--- /dev/null
@@ -0,0 +1,3 @@
+Improved compatibility for streamed files in :mod:`zipfile`. Previously an
+optional signature was not being written and certain ZIP applications were
+not supported. Patch by Silas Sewell.