summaryrefslogtreecommitdiffstats
path: root/generic/tclZlib.c
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2017-05-04 11:35:55 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2017-05-04 11:35:55 (GMT)
commitf9abf48ecf1f023447fcffb2ea01493818be568d (patch)
treeaa23eb13fad8a9338993374a7b32b979d92573d9 /generic/tclZlib.c
parent9c4eb9d12191daaee0a919967abc8f21b3f4fd99 (diff)
parent01c5c4ed35a709109c81b8583a1a32872297f1af (diff)
downloadtcl-f9abf48ecf1f023447fcffb2ea01493818be568d.zip
tcl-f9abf48ecf1f023447fcffb2ea01493818be568d.tar.gz
tcl-f9abf48ecf1f023447fcffb2ea01493818be568d.tar.bz2
merge novem
Diffstat (limited to 'generic/tclZlib.c')
-rw-r--r--generic/tclZlib.c38
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;