diff options
author | dkf <donal.k.fellows@manchester.ac.uk> | 2010-10-19 22:50:37 (GMT) |
---|---|---|
committer | dkf <donal.k.fellows@manchester.ac.uk> | 2010-10-19 22:50:37 (GMT) |
commit | 30afdd6c6e8d8d88e14402e7976a81f329b97364 (patch) | |
tree | 48ff659ae07503aceaa55c3c15cb6feee3d8e4c0 /generic/tclZlib.c | |
parent | 5d1610058df50e70544392db905e169a0c3982ed (diff) | |
download | tcl-30afdd6c6e8d8d88e14402e7976a81f329b97364.zip tcl-30afdd6c6e8d8d88e14402e7976a81f329b97364.tar.gz tcl-30afdd6c6e8d8d88e14402e7976a81f329b97364.tar.bz2 |
* generic/tclZlib.c (Tcl_ZlibStreamGet): [Bug 3081008]: Ensure that
when a bytearray gets its internals entangled with zlib for more than
a passing moment, that bytearray will never be shimmered away. This
increases the amount of copying but is simple to get right, which is a
reasonable trade-off.
* generic/tclStringObj.c (Tcl_AppendObjToObj): Added some special
cases so that most of the time when you build up a bytearray by
appending, it actually ends up being a bytearray rather than
shimmering back and forth to string.
* tests/http11.test (check_crc): Use a simpler way to express the
functionality of this procedure.
Diffstat (limited to 'generic/tclZlib.c')
-rw-r--r-- | generic/tclZlib.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/generic/tclZlib.c b/generic/tclZlib.c index b88e823..e429b86 100644 --- a/generic/tclZlib.c +++ b/generic/tclZlib.c @@ -13,7 +13,7 @@ * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclZlib.c,v 1.39 2010/10/19 21:23:32 dkf Exp $ + * RCS: @(#) $Id: tclZlib.c,v 1.40 2010/10/19 22:50:37 dkf Exp $ */ #include "tclInt.h" @@ -1047,10 +1047,15 @@ Tcl_ZlibStreamGet( if (listLen > 0) { /* * There is more input available, get it from the list and - * give it to zlib. + * give it to zlib. At this point, the data must not be shared + * since we require the bytearray representation to not vanish + * under our feet. [Bug 3081008] */ Tcl_ListObjIndex(NULL, zshPtr->inData, 0, &itemObj); + if (Tcl_IsShared(itemObj)) { + itemObj = Tcl_DuplicateObj(itemObj); + } itemPtr = Tcl_GetByteArrayFromObj(itemObj, &itemLen); Tcl_IncrRefCount(itemObj); zshPtr->currentInput = itemObj; @@ -1062,7 +1067,6 @@ Tcl_ZlibStreamGet( */ Tcl_ListObjReplace(NULL, zshPtr->inData, 0, 1, 0, NULL); - listLen--; } } @@ -1092,10 +1096,15 @@ Tcl_ZlibStreamGet( } /* - * Get the next block of data to go to inflate. + * Get the next block of data to go to inflate. At this point, the + * data must not be shared since we require the bytearray + * representation to not vanish under our feet. [Bug 3081008] */ Tcl_ListObjIndex(zshPtr->interp, zshPtr->inData, 0, &itemObj); + if (Tcl_IsShared(itemObj)) { + itemObj = Tcl_DuplicateObj(itemObj); + } itemPtr = Tcl_GetByteArrayFromObj(itemObj, &itemLen); Tcl_IncrRefCount(itemObj); zshPtr->currentInput = itemObj; |