summaryrefslogtreecommitdiffstats
path: root/generic/tclZlib.c
diff options
context:
space:
mode:
authordkf <donal.k.fellows@manchester.ac.uk>2012-04-15 10:07:22 (GMT)
committerdkf <donal.k.fellows@manchester.ac.uk>2012-04-15 10:07:22 (GMT)
commitb54406ffc1f268bdb88f9512f500f04e0bc0be2f (patch)
tree19f183ade4dcf0f11ce15400234c0bf75f9c4a48 /generic/tclZlib.c
parent93e3a238d03fe4237ec76d361f83547cf268ab29 (diff)
downloadtcl-b54406ffc1f268bdb88f9512f500f04e0bc0be2f.zip
tcl-b54406ffc1f268bdb88f9512f500f04e0bc0be2f.tar.gz
tcl-b54406ffc1f268bdb88f9512f500f04e0bc0be2f.tar.bz2
* generic/tclZlib.c (ZlibTransformSetOption): [Bug 3517696]: Make
flushing work correctly in a pushed compressing channel transform.
Diffstat (limited to 'generic/tclZlib.c')
-rw-r--r--generic/tclZlib.c22
1 files changed, 12 insertions, 10 deletions
diff --git a/generic/tclZlib.c b/generic/tclZlib.c
index 81012dc..341f8e0 100644
--- a/generic/tclZlib.c
+++ b/generic/tclZlib.c
@@ -2495,27 +2495,29 @@ ZlibTransformSetOption( /* not used */
*/
cd->outStream.avail_in = 0;
- do {
+ while (1) {
int e;
cd->outStream.next_out = (Bytef *) cd->outBuffer;
cd->outStream.avail_out = cd->outAllocated;
e = deflate(&cd->outStream, flushType);
- if (e != Z_OK) {
+ if (e == Z_BUF_ERROR) {
+ break;
+ } else if (e != Z_OK) {
ConvertError(interp, e);
return TCL_ERROR;
+ } else if (cd->outStream.avail_out == 0) {
+ break;
}
- if (cd->outStream.avail_out > 0) {
- if (Tcl_WriteRaw(cd->parent, cd->outBuffer,
- PTR2INT(cd->outStream.next_out)) < 0) {
- Tcl_AppendResult(interp, "problem flushing channel: ",
- Tcl_PosixError(interp), NULL);
- return TCL_ERROR;
- }
+ if (Tcl_WriteRaw(cd->parent, cd->outBuffer,
+ cd->outStream.next_out - (Bytef*)cd->outBuffer) < 0) {
+ Tcl_AppendResult(interp, "problem flushing channel: ",
+ Tcl_PosixError(interp), NULL);
+ return TCL_ERROR;
}
- } while (cd->outStream.avail_out > 0);
+ }
return TCL_OK;
}