summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2010-05-11 23:42:28 +0000
committerAntoine Pitrou <solipsis@pitrou.net>2010-05-11 23:42:28 +0000
commitfc3bfad2e0376ea5aa8a0c5352aafd3d731aaad7 (patch)
treee441f98008f8bcead20dddeaf5ed546fbc8d8475
parent37ffc3e3ba18d0e54ea6f79e9c8aad94f0b41a7d (diff)
downloadcpython-git-fc3bfad2e0376ea5aa8a0c5352aafd3d731aaad7.tar.gz
Issue #8681: Make the zlib module's error messages more informative when
the zlib itself doesn't give any detailed explanation.
-rw-r--r--Lib/test/test_zlib.py7
-rw-r--r--Misc/NEWS3
-rw-r--r--Modules/zlibmodule.c21
3 files changed, 27 insertions, 4 deletions
diff --git a/Lib/test/test_zlib.py b/Lib/test/test_zlib.py
index 2fc43139a2..cbc3ed4982 100644
--- a/Lib/test/test_zlib.py
+++ b/Lib/test/test_zlib.py
@@ -135,6 +135,13 @@ class CompressTestCase(BaseCompressTestCase, unittest.TestCase):
x = zlib.compress(data)
self.assertEqual(zlib.decompress(x), data)
+ def test_incomplete_stream(self):
+ # An useful error message is given
+ x = zlib.compress(HAMLET_SCENE)
+ self.assertRaisesRegexp(zlib.error,
+ "Error -5 while decompressing data: incomplete or truncated stream",
+ zlib.decompress, x[:-1])
+
# Memory use of the following functions takes into account overallocation
@precisionbigmemtest(size=_1G + 1024 * 1024, memuse=3)
diff --git a/Misc/NEWS b/Misc/NEWS
index e46162d016..803e0603db 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -62,6 +62,9 @@ Core and Builtins
Library
-------
+- Issue #8681: Make the zlib module's error messages more informative when
+ the zlib itself doesn't give any detailed explanation.
+
- Issue #8571: Fix an internal error when compressing or decompressing a
chunk larger than 1GB with the zlib module's compressor and decompressor
objects.
diff --git a/Modules/zlibmodule.c b/Modules/zlibmodule.c
index bb52fdc5c5..183f01e91a 100644
--- a/Modules/zlibmodule.c
+++ b/Modules/zlibmodule.c
@@ -72,10 +72,24 @@ typedef struct
static void
zlib_error(z_stream zst, int err, char *msg)
{
- if (zst.msg == Z_NULL)
+ const char *zmsg = zst.msg;
+ if (zmsg == Z_NULL) {
+ switch (err) {
+ case Z_BUF_ERROR:
+ zmsg = "incomplete or truncated stream";
+ break;
+ case Z_STREAM_ERROR:
+ zmsg = "inconsistent stream state";
+ break;
+ case Z_DATA_ERROR:
+ zmsg = "invalid input data";
+ break;
+ }
+ }
+ if (zmsg == Z_NULL)
PyErr_Format(ZlibError, "Error %d %s", err, msg);
else
- PyErr_Format(ZlibError, "Error %d %s: %.200s", err, msg, zst.msg);
+ PyErr_Format(ZlibError, "Error %d %s: %.200s", err, msg, zmsg);
}
PyDoc_STRVAR(compressobj__doc__,
@@ -248,8 +262,7 @@ PyZlib_decompress(PyObject *self, PyObject *args)
* process the inflate call() due to an error in the data.
*/
if (zst.avail_out > 0) {
- PyErr_Format(ZlibError, "Error %i while decompressing data",
- err);
+ zlib_error(zst, err, "while decompressing data");
inflateEnd(&zst);
goto error;
}