Author: Antonio Cuni <[email protected]>
Branch: 
Changeset: r68596:de464ba9c716
Date: 2014-01-11 11:56 +0100
http://bitbucket.org/pypy/pypy/changeset/de464ba9c716/

Log:    if the zipfile is corrupted we might get an uncaugth interp-level
        RZlibError, which results in a crash after translation. Catch it and
        raise the appropriate app-level exception

diff --git a/pypy/module/zipimport/interp_zipimport.py 
b/pypy/module/zipimport/interp_zipimport.py
--- a/pypy/module/zipimport/interp_zipimport.py
+++ b/pypy/module/zipimport/interp_zipimport.py
@@ -5,8 +5,10 @@
 from pypy.interpreter.typedef import TypeDef, GetSetProperty
 from pypy.interpreter.module import Module
 from pypy.module.imp import importing
+from pypy.module.zlib.interp_zlib import zlib_error
 from rpython.rlib.unroll import unrolling_iterable
 from rpython.rlib.rzipfile import RZipFile, BadZipfile
+from rpython.rlib.rzlib import RZlibError
 import os
 import stat
 
@@ -252,6 +254,10 @@
                 buf = self.zip_file.read(fname)
             except (KeyError, OSError, BadZipfile):
                 pass
+            except RZlibError, e:
+                # in this case, CPython raises the direct exception coming
+                # from the zlib module: let's to the same
+                raise zlib_error(space, e.msg)
             else:
                 if is_package:
                     pkgpath = (self.filename + os.path.sep +
diff --git a/pypy/module/zipimport/test/bad.zip 
b/pypy/module/zipimport/test/bad.zip
new file mode 100644
index 
0000000000000000000000000000000000000000..1d326a869a409a04dc46475bf157cb6f5bdb0664
GIT binary patch

[cut]

diff --git a/pypy/module/zipimport/test/test_zipimport_deflated.py 
b/pypy/module/zipimport/test/test_zipimport_deflated.py
--- a/pypy/module/zipimport/test/test_zipimport_deflated.py
+++ b/pypy/module/zipimport/test/test_zipimport_deflated.py
@@ -3,6 +3,7 @@
 from zipfile import ZIP_DEFLATED
 
 from pypy.module.zipimport.test.test_zipimport import AppTestZipimport as Base
+BAD_ZIP = str(py.path.local(__file__).dirpath('bad.zip'))
 
 class AppTestZipimportDeflated(Base):
     compression = ZIP_DEFLATED
@@ -16,3 +17,10 @@
         except ImportError:
             py.test.skip("zlib not available, cannot test compressed zipfiles")
         cls.make_class()
+        cls.w_BAD_ZIP = cls.space.wrap(BAD_ZIP)
+
+    def test_zlib_error(self):
+        import zipimport
+        import zlib
+        z = zipimport.zipimporter(self.BAD_ZIP)
+        raises(zlib.error, "z.load_module('mymod')")
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to