8000 zipfile: handle extras after a zip64 extra · thatch/cpython@0e079de · GitHub
[go: up one dir, main page]

Skip to content

Commit 0e079de

Browse files
committed
zipfile: handle extras after a zip64 extra
Previously, any data _after_ the zip64 extra would be removed. With many new tests. Fixes python#88233
1 parent d8c7a11 commit 0e079de

File tree

2 files changed

+54
-0
lines changed

2 files changed

+54
-0
lines changed

Lib/test/test_zipfile.py

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3424,6 +3424,58 @@ def test_cli_with_metadata_encoding_extract(self):
34243424
for name in self.file_names:
34253425
self.assertIn(name, listing)
34263426

3427+
class StripExtraTests(unittest.TestCase):
3428+
# Note: all of the "z&q 8000 uot; characters are technically invalid, but up to 3 bytes
3429+
# at the end of the extra will be passed through as they are too short to
3430+
# encode a valid extra.
3431+
def test_no_data(self):
3432+
s = struct.Struct("<HH")
3433+
a = s.pack(1, 0) # 1=zip64 exta signature
3434+
b = s.pack(2, 0)
3435+
c = s.pack(3, 0)
3436+
3437+
self.assertEqual(b'', zipfile._strip_extra(a, (1,)))
3438+
self.assertEqual(b, zipfile._strip_extra(b, (1,)))
3439+
self.assertEqual(b+b"z", zipfile._strip_extra(b+b"z", (1,)))
3440+
3441+
self.assertEqual(b+c, zipfile._strip_extra(a+b+c, (1,)))
3442+
self.assertEqual(b+c, zipfile._strip_extra(b+a+c, (1,)))
3443+
self.assertEqual(b+c, zipfile._strip_extra(b+c+a, (1,)))
3444+
3445+
def test_with_data(self):
3446+
s = struct.Struct("<HH")
3447+
a = s.pack(1, 1) + b"a" # 1=zip64 exta signature
3448+
b = s.pack(2, 2) + b"bb"
3449+
c = s.pack(3, 3) + b"ccc"
3450+
3451+
self.assertEqual(b"", zipfile._strip_extra(a, (1,)))
3452+
self.assertEqual(b, zipfile._strip_extra(b, (1,)))
3453+
self.assertEqual(b+b"z", zipfile._strip_extra(b+b"z", (1,)))
3454+
3455+
self.assertEqual(b+c, zipfile._strip_extra(a+b+c, (1,)))
3456+
self.assertEqual(b+c, zipfile._strip_extra(b+a+c, (1,)))
3457+
self.assertEqual(b+c, zipfile._strip_extra(b+c+a, (1,)))
3458+
3459+
def test_multiples(self):
3460+
s = struct.Struct("<HH")
3461+
a = s.pack(1, 1) + b"a" # 1=zip64 exta signature
3462+
b = s.pack(2, 2) + b"bb"
3463+
c = s.pack(3, 3) + b"ccc"
3464+
3465+
self.assertEqual(b"", zipfile._strip_extra(a+a, (1,)))
3466+
self.assertEqual(b"", zipfile._strip_extra(a+a+a, (1,)))
3467+
self.assertEqual(b"z", zipfile._strip_extra(a+a+b"z", (1,)))
3468+
self.assertEqual(b+b"z", zipfile._strip_extra(a+a+b+b"z", (1,)))
3469+
3470+
self.assertEqual(b, zipfile._strip_extra(a+a+b, (1,)))
3471+
self.assertEqual(b, zipfile._strip_extra(a+b+a, (1,)))
3472+
self.assertEqual(b, zipfile._strip_extra(b+a+a, (1,)))
3473+
3474+
def test_too_short(self):
3475+
self.assertEqual(b"", zipfile._strip_extra(b"", (1,)))
3476+
self.assertEqual(b"z", zipfile._strip_extra(b"z", (1,)))
3477+
self.assertEqual(b"zz", zipfile._strip_extra(b"zz", (1,)))
3478+
self.assertEqual(b"zzz", zipfile._strip_extra(b"zzz", (1,)))
34273479

34283480
if __name__ == "__main__":
34293481
unittest.main()

Lib/zipfile.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,8 @@ def _strip_extra(extra, xids):
211211
i = j
212212
if not modified:
213213
return extra
214+
if start != len(extra):
215+
buffer.append(extra[start:])
214216
return b''.join(buffer)
215217

216218
def _check_zipfile(fp):

0 commit comments

Comments
 (0)
0