]> granicus.if.org Git - python/commitdiff
Merged revisions 81100 via svnmerge from
authorAntoine Pitrou <solipsis@pitrou.net>
Tue, 11 May 2010 23:49:58 +0000 (23:49 +0000)
committerAntoine Pitrou <solipsis@pitrou.net>
Tue, 11 May 2010 23:49:58 +0000 (23:49 +0000)
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.
  ........
................

Lib/test/test_zlib.py
Misc/NEWS
Modules/zlibmodule.c

index 0c259ccffbb825b565eff87e79999b2d5ebf2c51..4b16efb2103e804652bbc3bfb1602acc148e6fd9 100644 (file)
@@ -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)
index 66071ebdc0f1791a6da26a78d1d99e2ede95ab80..e42566f365e4e19f8561f48b776889e90cc03e4d 100644 (file)
--- 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.
 
index 1f263abe60a75329c6bdd83474376c2aecb2522f..54ab9a149959ff12a19d46529931a281c70c362e 100644 (file)
@@ -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;
             }