mirror of
https://github.com/python/cpython.git
synced 2025-10-09 16:34:44 +00:00
gh-88233: zipfile: handle extras after a zip64 extra (GH-96161)
Previously, any data _after_ the zip64 extra would be removed. With many new tests. Fixes #88233 Automerge-Triggered-By: GH:jaraco
This commit is contained in:
parent
ed01addb59
commit
59e86caca8
3 changed files with 66 additions and 0 deletions
|
@ -3010,5 +3010,67 @@ class EncodedMetadataTests(unittest.TestCase):
|
|||
self.assertIn(name, listing)
|
||||
|
||||
|
||||
class StripExtraTests(unittest.TestCase):
|
||||
# Note: all of the "z" characters are technically invalid, but up
|
||||
# to 3 bytes at the end of the extra will be passed through as they
|
||||
# are too short to encode a valid extra.
|
||||
|
||||
ZIP64_EXTRA = 1
|
||||
|
||||
def test_no_data(self):
|
||||
s = struct.Struct("<HH")
|
||||
a = s.pack(self.ZIP64_EXTRA, 0)
|
||||
b = s.pack(2, 0)
|
||||
c = s.pack(3, 0)
|
||||
|
||||
self.assertEqual(b'', zipfile._strip_extra(a, (self.ZIP64_EXTRA,)))
|
||||
self.assertEqual(b, zipfile._strip_extra(b, (self.ZIP64_EXTRA,)))
|
||||
self.assertEqual(
|
||||
b+b"z", zipfile._strip_extra(b+b"z", (self.ZIP64_EXTRA,)))
|
||||
|
||||
self.assertEqual(b+c, zipfile._strip_extra(a+b+c, (self.ZIP64_EXTRA,)))
|
||||
self.assertEqual(b+c, zipfile._strip_extra(b+a+c, (self.ZIP64_EXTRA,)))
|
||||
self.assertEqual(b+c, zipfile._strip_extra(b+c+a, (self.ZIP64_EXTRA,)))
|
||||
|
||||
def test_with_data(self):
|
||||
s = struct.Struct("<HH")
|
||||
a = s.pack(self.ZIP64_EXTRA, 1) + b"a"
|
||||
b = s.pack(2, 2) + b"bb"
|
||||
c = s.pack(3, 3) + b"ccc"
|
||||
|
||||
self.assertEqual(b"", zipfile._strip_extra(a, (self.ZIP64_EXTRA,)))
|
||||
self.assertEqual(b, zipfile._strip_extra(b, (self.ZIP64_EXTRA,)))
|
||||
self.assertEqual(
|
||||
b+b"z", zipfile._strip_extra(b+b"z", (self.ZIP64_EXTRA,)))
|
||||
|
||||
self.assertEqual(b+c, zipfile._strip_extra(a+b+c, (self.ZIP64_EXTRA,)))
|
||||
self.assertEqual(b+c, zipfile._strip_extra(b+a+c, (self.ZIP64_EXTRA,)))
|
||||
self.assertEqual(b+c, zipfile._strip_extra(b+c+a, (self.ZIP64_EXTRA,)))
|
||||
|
||||
def test_multiples(self):
|
||||
s = struct.Struct("<HH")
|
||||
a = s.pack(self.ZIP64_EXTRA, 1) + b"a"
|
||||
b = s.pack(2, 2) + b"bb"
|
||||
|
||||
self.assertEqual(b"", zipfile._strip_extra(a+a, (self.ZIP64_EXTRA,)))
|
||||
self.assertEqual(b"", zipfile._strip_extra(a+a+a, (self.ZIP64_EXTRA,)))
|
||||
self.assertEqual(
|
||||
b"z", zipfile._strip_extra(a+a+b"z", (self.ZIP64_EXTRA,)))
|
||||
self.assertEqual(
|
||||
b+b"z", zipfile._strip_extra(a+a+b+b"z", (self.ZIP64_EXTRA,)))
|
||||
|
||||
self.assertEqual(b, zipfile._strip_extra(a+a+b, (self.ZIP64_EXTRA,)))
|
||||
self.assertEqual(b, zipfile._strip_extra(a+b+a, (self.ZIP64_EXTRA,)))
|
||||
self.assertEqual(b, zipfile._strip_extra(b+a+a, (self.ZIP64_EXTRA,)))
|
||||
|
||||
def test_too_short(self):
|
||||
self.assertEqual(b"", zipfile._strip_extra(b"", (self.ZIP64_EXTRA,)))
|
||||
self.assertEqual(b"z", zipfile._strip_extra(b"z", (self.ZIP64_EXTRA,)))
|
||||
self.assertEqual(
|
||||
b"zz", zipfile._strip_extra(b"zz", (self.ZIP64_EXTRA,)))
|
||||
self.assertEqual(
|
||||
b"zzz", zipfile._strip_extra(b"zzz", (self.ZIP64_EXTRA,)))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
|
|
@ -207,6 +207,8 @@ def _strip_extra(extra, xids):
|
|||
i = j
|
||||
if not modified:
|
||||
return extra
|
||||
if start != len(extra):
|
||||
buffer.append(extra[start:])
|
||||
return b''.join(buffer)
|
||||
|
||||
def _check_zipfile(fp):
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
Correctly preserve "extra" fields in ``zipfile`` regardless of their
|
||||
ordering relative to a zip64 "extra."
|
Loading…
Add table
Add a link
Reference in a new issue