[Python-checkins] cpython: Detect unsupported compression types.

martin.v.loewis python-checkins at python.org
Tue May 1 08:38:28 CEST 2012


http://hg.python.org/cpython/rev/596b0eaeece8
changeset:   76683:596b0eaeece8
user:        Martin v. Löwis <martin at v.loewis.de>
date:        Tue May 01 08:38:01 2012 +0200
summary:
  Detect unsupported compression types.

files:
  Lib/test/test_zipfile.py |  11 +++++++++++
  Lib/zipfile.py           |  21 +++++++++++++++++++--
  2 files changed, 30 insertions(+), 2 deletions(-)


diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py
--- a/Lib/test/test_zipfile.py
+++ b/Lib/test/test_zipfile.py
@@ -992,6 +992,17 @@
         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
--- a/Lib/zipfile.py
+++ b/Lib/zipfile.py
@@ -504,12 +504,29 @@
 
 
 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):

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list