]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-34472: Add data descriptor signature to zipfile (GH-8871) (GH-9399)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Sat, 22 Sep 2018 18:03:04 +0000 (11:03 -0700)
committerSerhiy Storchaka <storchaka@gmail.com>
Sat, 22 Sep 2018 18:03:04 +0000 (21:03 +0300)
This makes streamed zips compatible with MacOS Archive Utility and
other applications.
(cherry picked from commit 4ba3b50bfe6d50cd82d208023ea23e203ab50589)

Co-authored-by: Silas Sewell <silas@sewell.org>
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 9f88512d9838b19cf946db3d9fe3037eba29f372..a43878575db86ed979bff166c8097f8fd6d1f158 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):
@@ -1114,8 +1116,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 1c53672e1cf0b23ce4f14b6d8962ec0893bbe05c..7cd8ebf26fbf6b0f8d3df2a94f9d3ebbf9ce2edb 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -1456,6 +1456,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.