From: Antoine Pitrou Date: Tue, 11 May 2010 23:49:58 +0000 (+0000) Subject: Merged revisions 81100 via svnmerge from X-Git-Tag: v3.1.3rc1~779 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=96f212b3777c113a326bfbbba93c453fbd5e0693;p=python Merged revisions 81100 via svnmerge from svn+ssh://pythondev@svn.python.org/python/branches/py3k ................ r81100 | antoine.pitrou | 2010-05-12 01:46:02 +0200 (mer., 12 mai 2010) | 10 lines Merged revisions 81098 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r81098 | antoine.pitrou | 2010-05-12 01:42:28 +0200 (mer., 12 mai 2010) | 5 lines Issue #8681: Make the zlib module's error messages more informative when the zlib itself doesn't give any detailed explanation. ........ ................ --- diff --git a/Lib/test/test_zlib.py b/Lib/test/test_zlib.py index 0c259ccffb..4b16efb210 100644 --- a/Lib/test/test_zlib.py +++ b/Lib/test/test_zlib.py @@ -140,6 +140,13 @@ class CompressTestCase(BaseCompressTestCase, unittest.TestCase): for ob in x, bytearray(x): self.assertEqual(zlib.decompress(ob), 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 66071ebdc0..e42566f365 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -40,6 +40,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 #8674: Fixed a number of incorrect or undefined-behaviour-inducing overflow checks in the audioop module. diff --git a/Modules/zlibmodule.c b/Modules/zlibmodule.c index 1f263abe60..54ab9a1499 100644 --- a/Modules/zlibmodule.c +++ b/Modules/zlibmodule.c @@ -52,10 +52,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__, @@ -241,8 +255,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; }