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 @@ _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:

View File

@ -1468,6 +1468,7 @@ Roger D. Serwy
Jerry Seutter
Pete Sevander
Denis Severson
Silas Sewell
Ian Seyer
Dmitry Shachnev
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.