summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--generic/tclZlib.c16
-rw-r--r--tests/zlib.test16
2 files changed, 32 insertions, 0 deletions
diff --git a/generic/tclZlib.c b/generic/tclZlib.c
index 585b500..544ba50 100644
--- a/generic/tclZlib.c
+++ b/generic/tclZlib.c
@@ -1237,6 +1237,22 @@ Tcl_ZlibStreamGet(
}
}
+ /*
+ * When dealing with a raw stream, we set the dictionary here, once.
+ * (You can't do it in response to getting Z_NEED_DATA as raw streams
+ * don't ever issue that.)
+ */
+
+ if (zshPtr->format == TCL_ZLIB_FORMAT_RAW && zshPtr->compDictObj) {
+ e = SetInflateDictionary(&zshPtr->stream, zshPtr->compDictObj);
+ if (e != Z_OK) {
+ ConvertError(zshPtr->interp, e, zshPtr->stream.adler);
+ return TCL_ERROR;
+ }
+ Tcl_DecrRefCount(zshPtr->compDictObj);
+ zshPtr->compDictObj = NULL;
+ }
+
e = inflate(&zshPtr->stream, zshPtr->flush);
if (e == Z_NEED_DICT && zshPtr->compDictObj) {
e = SetInflateDictionary(&zshPtr->stream, zshPtr->compDictObj);
diff --git a/tests/zlib.test b/tests/zlib.test
index 18b6f55..5d46926 100644
--- a/tests/zlib.test
+++ b/tests/zlib.test
@@ -293,6 +293,22 @@ test zlib-8.11 {transformtion and fconfigure} -setup {
catch {close $inSide}
catch {$strm close}
} -result {358 358}
+test zlib-8.13 {transformtion and fconfigure} -setup {
+ lassign [chan pipe] inSide outSide
+ set strm [zlib stream compress]
+} -constraints {zlib knownBug} -body {
+ set data [$strm add -dictionary $spdyDict $spdyHeaders]
+ zlib push decompress $inSide
+ fconfigure $outSide -blocking 0 -translation binary
+ fconfigure $inSide -translation binary -dictionary $spdyDict
+ puts -nonewline $outSide $data
+ close $outSide
+ list [string length $spdyHeaders] [string length [read $inSide]]
+} -cleanup {
+ catch {close $outSide}
+ catch {close $inSide}
+ catch {$strm close}
+} -result {358 358}
test zlib-9.1 "check fcopy with push" -constraints zlib -setup {
set sfile [makeFile {} testsrc.gz]