summaryrefslogtreecommitdiffstats
path: root/Lib/test
diff options
context:
space:
mode:
authorGregory P. Smith <greg@krypto.org>2014-05-30 06:42:14 (GMT)
committerGregory P. Smith <greg@krypto.org>2014-05-30 06:42:14 (GMT)
commit0af8a86be85ecf1899d0770c6d31541128ea8cad (patch)
tree8df8ec9805b36de4d5093109b84a0feb34a8ff00 /Lib/test
parent58cfdd8af80f2ffa44b207e0846ddbe7f73836cb (diff)
downloadcpython-0af8a86be85ecf1899d0770c6d31541128ea8cad.zip
cpython-0af8a86be85ecf1899d0770c6d31541128ea8cad.tar.gz
cpython-0af8a86be85ecf1899d0770c6d31541128ea8cad.tar.bz2
Fix issue #14315: The zipfile module now ignores extra fields in the central
directory that are too short to be parsed instead of letting a struct.unpack error bubble up as this "bad data" appears in many real world zip files in the wild and is ignored by other zip tools.
Diffstat (limited to 'Lib/test')
-rw-r--r--Lib/test/test_zipfile.py15
1 files changed, 15 insertions, 0 deletions
diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py
index 1bef575..0ee75ad 100644
--- a/Lib/test/test_zipfile.py
+++ b/Lib/test/test_zipfile.py
@@ -1290,6 +1290,21 @@ class OtherTests(unittest.TestCase):
self.assertRaises(ValueError,
zipfile.ZipInfo, 'seventies', (1979, 1, 1, 0, 0, 0))
+ def test_zipfile_with_short_extra_field(self):
+ """If an extra field in the header is less than 4 bytes, skip it."""
+ zipdata = (
+ b'PK\x03\x04\x14\x00\x00\x00\x00\x00\x93\x9b\xad@\x8b\x9e'
+ b'\xd9\xd3\x01\x00\x00\x00\x01\x00\x00\x00\x03\x00\x03\x00ab'
+ b'c\x00\x00\x00APK\x01\x02\x14\x03\x14\x00\x00\x00\x00'
+ b'\x00\x93\x9b\xad@\x8b\x9e\xd9\xd3\x01\x00\x00\x00\x01\x00\x00'
+ b'\x00\x03\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00'
+ b'\x00\x00\x00abc\x00\x00PK\x05\x06\x00\x00\x00\x00'
+ b'\x01\x00\x01\x003\x00\x00\x00%\x00\x00\x00\x00\x00'
+ )
+ with zipfile.ZipFile(io.BytesIO(zipdata), 'r') as zipf:
+ # testzip returns the name of the first corrupt file, or None
+ self.assertIsNone(zipf.testzip())
+
def tearDown(self):
unlink(TESTFN)
unlink(TESTFN2)