diff --git a/Modules/zlibmodule.c b/Modules/zlibmodule.c --- a/Modules/zlibmodule.c +++ b/Modules/zlibmodule.c @@ -55,6 +55,9 @@ zlib_error(z_stream zst, int err, char * const char *zmsg = zst.msg; if (zmsg == Z_NULL) { switch (err) { + /* Z_OK in unflush() means we never get to Z_STREAM_END, + so it must be that the stream is truncated */ + case Z_OK: case Z_BUF_ERROR: zmsg = "incomplete or truncated stream"; break; @@ -697,7 +700,7 @@ PyZlib_flush(compobject *self, PyObject if (err == Z_STREAM_END && flushmode == Z_FINISH) { err = deflateEnd(&(self->zst)); if (err != Z_OK) { - zlib_error(self->zst, err, "from deflateEnd()"); + zlib_error(self->zst, err, "while finishing compression"); Py_DECREF(RetVal); RetVal = NULL; goto error; @@ -881,18 +884,22 @@ PyZlib_unflush(compobject *self, PyObjec Py_END_ALLOW_THREADS } - /* If flushmode is Z_FINISH, we also have to call deflateEnd() to free - various data structures. Note we should only get Z_STREAM_END when - flushmode is Z_FINISH */ + /* As flushmode is Z_FINISH, we also have to call inflateEnd() to free + various data structures */ if (err == Z_STREAM_END) { err = inflateEnd(&(self->zst)); self->is_initialised = 0; if (err != Z_OK) { - zlib_error(self->zst, err, "from inflateEnd()"); + zlib_error(self->zst, err, "while finishing data decompression"); Py_DECREF(retval); retval = NULL; goto error; } + } else { + zlib_error(self->zst, err, "while decompressing data"); + Py_DECREF(retval); + retval = NULL; + goto error; } if (_PyBytes_Resize(&retval, self->zst.total_out - start_total_out) < 0) { Py_DECREF(retval);