]> granicus.if.org Git - python/commitdiff
Detect unsupported compression types.
authorMartin v. Löwis <martin@v.loewis.de>
Tue, 1 May 2012 06:38:01 +0000 (08:38 +0200)
committerMartin v. Löwis <martin@v.loewis.de>
Tue, 1 May 2012 06:38:01 +0000 (08:38 +0200)
Lib/test/test_zipfile.py
Lib/zipfile.py

index c6039ccf2cc803c14c4c09920bea0bd7979d0ffa..dcf8f746f5fbfadf350eee562477ddfc88560094 100644 (file)
@@ -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."""
index 1cdfcebc450e2d0e6d33c88493bb38501da9e34f..ff7f30fd4fa4e34382348dfee012a0b378b4ef68 100644 (file)
@@ -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):