[Python-checkins] r81098 - in python/trunk: Lib/test/test_zlib.py Misc/NEWS Modules/zlibmodule.c

antoine.pitrou python-checkins at python.org
Wed May 12 01:42:28 CEST 2010


Author: antoine.pitrou
Date: Wed May 12 01:42:28 2010
New Revision: 81098

Log:
Issue #8681: Make the zlib module's error messages more informative when
the zlib itself doesn't give any detailed explanation.




Modified:
   python/trunk/Lib/test/test_zlib.py
   python/trunk/Misc/NEWS
   python/trunk/Modules/zlibmodule.c

Modified: python/trunk/Lib/test/test_zlib.py
==============================================================================
--- python/trunk/Lib/test/test_zlib.py	(original)
+++ python/trunk/Lib/test/test_zlib.py	Wed May 12 01:42:28 2010
@@ -135,6 +135,13 @@
         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)

Modified: python/trunk/Misc/NEWS
==============================================================================
--- python/trunk/Misc/NEWS	(original)
+++ python/trunk/Misc/NEWS	Wed May 12 01:42:28 2010
@@ -62,6 +62,9 @@
 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.

Modified: python/trunk/Modules/zlibmodule.c
==============================================================================
--- python/trunk/Modules/zlibmodule.c	(original)
+++ python/trunk/Modules/zlibmodule.c	Wed May 12 01:42:28 2010
@@ -72,10 +72,24 @@
 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 @@
              * 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;
             }


More information about the Python-checkins mailing list