summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin v. Löwis <martin@v.loewis.de>2012-05-01 06:38:01 (GMT)
committerMartin v. Löwis <martin@v.loewis.de>2012-05-01 06:38:01 (GMT)
commitb3260f08cf9066367f63dccbac60798d555e52b9 (patch)
treef881c9997a44593b2bbea29f9ccae7d3cb8b1da7
parentf6b16a4b507723b1a22e6cc5af80150f189b3e9d (diff)
downloadcpython-b3260f08cf9066367f63dccbac60798d555e52b9.zip
cpython-b3260f08cf9066367f63dccbac60798d555e52b9.tar.gz
cpython-b3260f08cf9066367f63dccbac60798d555e52b9.tar.bz2
Detect unsupported compression types.
-rw-r--r--Lib/test/test_zipfile.py11
-rw-r--r--Lib/zipfile.py21
2 files changed, 30 insertions, 2 deletions
diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py
index c6039cc..dcf8f74 100644
--- a/Lib/test/test_zipfile.py
+++ b/Lib/test/test_zipfile.py
@@ -992,6 +992,17 @@ class OtherTests(unittest.TestCase):
caught."""
self.assertRaises(RuntimeError, zipfile.ZipFile, TESTFN, "w", -1)
+ def test_unsupported_compression(self):
+ # data is declared as shrunk, but actually deflated
+ data = (b'PK\x03\x04.\x00\x00\x00\x01\x00\xe4C\xa1@\x00\x00\x00'
+ b'\x00\x02\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00x\x03\x00PK\x01'
+ b'\x02.\x03.\x00\x00\x00\x01\x00\xe4C\xa1@\x00\x00\x00\x00\x02\x00\x00'
+ b'\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+ b'\x80\x01\x00\x00\x00\x00xPK\x05\x06\x00\x00\x00\x00\x01\x00\x01\x00'
+ b'/\x00\x00\x00!\x00\x00\x00\x00\x00')
+ with zipfile.ZipFile(io.BytesIO(data), 'r') as zipf:
+ self.assertRaises(NotImplementedError, zipf.open, 'x')
+
def test_null_byte_in_filename(self):
"""Check that a filename containing a null byte is properly
terminated."""
diff --git a/Lib/zipfile.py b/Lib/zipfile.py
index 1cdfceb..ff7f30f 100644
--- a/Lib/zipfile.py
+++ b/Lib/zipfile.py
@@ -504,12 +504,29 @@ def _get_compressor(compress_type):
def _get_decompressor(compress_type):
- if compress_type == ZIP_DEFLATED:
+ if compress_type == ZIP_STORED:
+ return None
+ elif compress_type == ZIP_DEFLATED:
return zlib.decompressobj(-15)
elif compress_type == ZIP_BZIP2:
return bz2.BZ2Decompressor()
else:
- return None
+ unknown_compressors = {
+ 1: 'shrink',
+ 2: 'reduce',
+ 3: 'reduce',
+ 4: 'reduce',
+ 5: 'reduce',
+ 6: 'implode',
+ 9: 'enhanced deflate',
+ 10: 'implode',
+ 14: 'lzma',
+ }
+ descr = unknown_compressors.get(compress_type)
+ if descr:
+ raise NotImplementedError("compression type %d (%s)" % (compress_type, descr))
+ else:
+ raise NotImplementedError("compression type %d" % (compress_type,))
class ZipExtFile(io.BufferedIOBase):