bpo-34472: Add data descriptor signature to zipfile (GH-8871)

This makes streamed zips compatible with MacOS Archive Utility and
other applications.
This commit is contained in:
Silas Sewell 2018-09-18 13:00:05 -04:00 committed by Serhiy Storchaka
parent d0f49d2f50
commit 4ba3b50bfe
3 changed files with 8 additions and 2 deletions

View File

@ -159,6 +159,8 @@ class LargeZipFile(Exception):
_CD64_DIRECTORY_SIZE = 8 _CD64_DIRECTORY_SIZE = 8
_CD64_OFFSET_START_CENTDIR = 9 _CD64_OFFSET_START_CENTDIR = 9
_DD_SIGNATURE = 0x08074b50
_EXTRA_FIELD_STRUCT = struct.Struct('<HH') _EXTRA_FIELD_STRUCT = struct.Struct('<HH')
def _strip_extra(extra, xids): def _strip_extra(extra, xids):
@ -1118,8 +1120,8 @@ def close(self):
# Write updated header info # Write updated header info
if self._zinfo.flag_bits & 0x08: if self._zinfo.flag_bits & 0x08:
# Write CRC and file sizes after the file data # Write CRC and file sizes after the file data
fmt = '<LQQ' if self._zip64 else '<LLL' fmt = '<LLQQ' if self._zip64 else '<LLLL'
self._fileobj.write(struct.pack(fmt, self._zinfo.CRC, self._fileobj.write(struct.pack(fmt, _DD_SIGNATURE, self._zinfo.CRC,
self._zinfo.compress_size, self._zinfo.file_size)) self._zinfo.compress_size, self._zinfo.file_size))
self._zipfile.start_dir = self._fileobj.tell() self._zipfile.start_dir = self._fileobj.tell()
else: else:

View File

@ -1468,6 +1468,7 @@ Roger D. Serwy
Jerry Seutter Jerry Seutter
Pete Sevander Pete Sevander
Denis Severson Denis Severson
Silas Sewell
Ian Seyer Ian Seyer
Dmitry Shachnev Dmitry Shachnev
Anish Shah Anish Shah

View File

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