diff options
author | jan.nijtmans <nijtmans@users.sourceforge.net> | 2017-05-04 11:35:55 (GMT) |
---|---|---|
committer | jan.nijtmans <nijtmans@users.sourceforge.net> | 2017-05-04 11:35:55 (GMT) |
commit | f9abf48ecf1f023447fcffb2ea01493818be568d (patch) | |
tree | aa23eb13fad8a9338993374a7b32b979d92573d9 /generic/tclZlib.c | |
parent | 9c4eb9d12191daaee0a919967abc8f21b3f4fd99 (diff) | |
parent | 01c5c4ed35a709109c81b8583a1a32872297f1af (diff) | |
download | tcl-f9abf48ecf1f023447fcffb2ea01493818be568d.zip tcl-f9abf48ecf1f023447fcffb2ea01493818be568d.tar.gz tcl-f9abf48ecf1f023447fcffb2ea01493818be568d.tar.bz2 |
merge novem
Diffstat (limited to 'generic/tclZlib.c')
-rw-r--r-- | generic/tclZlib.c | 38 |
1 files changed, 18 insertions, 20 deletions
diff --git a/generic/tclZlib.c b/generic/tclZlib.c index 8790a24..1c61c28 100644 --- a/generic/tclZlib.c +++ b/generic/tclZlib.c @@ -1204,10 +1204,10 @@ Tcl_ZlibStreamPut( zshPtr->stream.avail_in = size; /* - * Must not do a zero-length compress. [Bug 25842c161] + * Must not do a zero-length compress unless finalizing. [Bug 25842c161] */ - if (size == 0) { + if (size == 0 && flush != Z_FINISH) { return TCL_OK; } @@ -3113,30 +3113,28 @@ ZlibTransformOutput( errorCodePtr); } + /* + * No zero-length writes. Flushes must be explicit. + */ + + if (toWrite == 0) { + return 0; + } + cd->outStream.next_in = (Bytef *) buf; cd->outStream.avail_in = toWrite; - do { + while (cd->outStream.avail_in > 0) { e = Deflate(&cd->outStream, cd->outBuffer, cd->outAllocated, Z_NO_FLUSH, &produced); + if (e != Z_OK || produced == 0) { + break; + } - if ((e == Z_OK && produced > 0) || e == Z_BUF_ERROR) { - /* - * deflate() indicates that it is out of space by returning - * Z_BUF_ERROR *or* by simply returning Z_OK with no remaining - * space; in either case, we must write the whole buffer out and - * retry to compress what is left. - */ - - if (e == Z_BUF_ERROR) { - produced = cd->outAllocated; - e = Z_OK; - } - if (Tcl_WriteRaw(cd->parent, cd->outBuffer, produced) < 0) { - *errorCodePtr = Tcl_GetErrno(); - return -1; - } + if (Tcl_WriteRaw(cd->parent, cd->outBuffer, produced) < 0) { + *errorCodePtr = Tcl_GetErrno(); + return -1; } - } while (e == Z_OK && produced > 0 && cd->outStream.avail_in > 0); + } if (e == Z_OK) { return toWrite - cd->outStream.avail_in; |