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