Kyle Altendorf <[email protected]> added the comment:
Python 3.7 works with 2-byte elements, I managed to find the wrong section in
the doc-linked docs.
4.5 Extensible data fields
--------------------------
4.5.1 In order to allow different programs and different types
of information to be stored in the 'extra' field in .ZIP
files, the following structure MUST be used for all
programs storing data in this field:
header1+data1 + header2+data2 . . .
Each header should consist of:
Header ID - 2 bytes
Data Size - 2 bytes
Note: all fields stored in Intel low-byte/high-byte order.
And the test showing it working.
----
import sys
import zipfile
print(sys.version)
fn = sys.argv[1]
print(fn)
options = {
'endianness': ('little', 'big'),
'header_element_bytes': (2, 4),
'additional_size': (0, 4, 4 + 4),
}
for endianness in options['endianness']:
for additional_size in options['additional_size']:
for header_element_bytes in options['header_element_bytes']:
print('\n\n --- trying endianness: {}, additional_size: {},
header_element_bytes: {}'.format(endianness, additional_size,
header_element_bytes))
with zipfile.ZipFile(fn, 'w') as zf:
zi = zipfile.ZipInfo("0")
extra_data = b"hello, extra, and some more just to make it
longer and such so yeah"
zi.extra = (
(42).to_bytes(header_element_bytes, endianness)
+ (len(extra_data) +
additional_size).to_bytes(header_element_bytes, endianness)
+ extra_data
)
zf.writestr(zi, b"the real data")
try:
zipfile.ZipFile(fn)
except Exception as e:
print(e)
else:
print('success')
----
altendky@lt:~/twisted$ python3.7 ../z.py 37.py
3.7.0 (default, Jul 7 2018, 15:49:24)
[GCC 6.3.0 20170516]
37.py
--- trying endianness: little, additional_size: 0, header_element_bytes: 2
success
--- trying endianness: little, additional_size: 0, header_element_bytes: 4
Corrupt extra field 6568 (size=27756)
--- trying endianness: little, additional_size: 4, header_element_bytes: 2
Corrupt extra field 002a (size=71)
--- trying endianness: little, additional_size: 4, header_element_bytes: 4
Corrupt extra field 6568 (size=27756)
--- trying endianness: little, additional_size: 8, header_element_bytes: 2
Corrupt extra field 002a (size=75)
--- trying endianness: little, additional_size: 8, header_element_bytes: 4
Corrupt extra field 6568 (size=27756)
--- trying endianness: big, additional_size: 0, header_element_bytes: 2
Corrupt extra field 2a00 (size=17152)
--- trying endianness: big, additional_size: 0, header_element_bytes: 4
Corrupt extra field 0000 (size=10752)
--- trying endianness: big, additional_size: 4, header_element_bytes: 2
Corrupt extra field 2a00 (size=18176)
--- trying endianness: big, additional_size: 4, header_element_bytes: 4
Corrupt extra field 0000 (size=10752)
--- trying endianness: big, additional_size: 8, header_element_bytes: 2
Corrupt extra field 2a00 (size=19200)
--- trying endianness: big, additional_size: 8, header_element_bytes: 4
Corrupt extra field 0000 (size=10752)
----------
_______________________________________
Python tracker <[email protected]>
<https://bugs.python.org/issue34606>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com