mirror of
https://github.com/python/cpython.git
synced 2025-11-28 22:18:54 +00:00
Issue #8681: Make the zlib module's error messages more informative when
the zlib itself doesn't give any detailed explanation.
This commit is contained in:
parent
37ffc3e3ba
commit
fc3bfad2e0
3 changed files with 27 additions and 4 deletions
|
|
@ -135,6 +135,13 @@ class CompressTestCase(BaseCompressTestCase, unittest.TestCase):
|
||||||
x = zlib.compress(data)
|
x = zlib.compress(data)
|
||||||
self.assertEqual(zlib.decompress(x), 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
|
# Memory use of the following functions takes into account overallocation
|
||||||
|
|
||||||
@precisionbigmemtest(size=_1G + 1024 * 1024, memuse=3)
|
@precisionbigmemtest(size=_1G + 1024 * 1024, memuse=3)
|
||||||
|
|
|
||||||
|
|
@ -62,6 +62,9 @@ Core and Builtins
|
||||||
Library
|
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
|
- Issue #8571: Fix an internal error when compressing or decompressing a
|
||||||
chunk larger than 1GB with the zlib module's compressor and decompressor
|
chunk larger than 1GB with the zlib module's compressor and decompressor
|
||||||
objects.
|
objects.
|
||||||
|
|
|
||||||
|
|
@ -72,10 +72,24 @@ typedef struct
|
||||||
static void
|
static void
|
||||||
zlib_error(z_stream zst, int err, char *msg)
|
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);
|
PyErr_Format(ZlibError, "Error %d %s", err, msg);
|
||||||
else
|
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__,
|
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.
|
* process the inflate call() due to an error in the data.
|
||||||
*/
|
*/
|
||||||
if (zst.avail_out > 0) {
|
if (zst.avail_out > 0) {
|
||||||
PyErr_Format(ZlibError, "Error %i while decompressing data",
|
zlib_error(zst, err, "while decompressing data");
|
||||||
err);
|
|
||||||
inflateEnd(&zst);
|
inflateEnd(&zst);
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue