diff options
author | hobbs <hobbs> | 2007-12-09 22:24:01 (GMT) |
---|---|---|
committer | hobbs <hobbs> | 2007-12-09 22:24:01 (GMT) |
commit | 15e9d469b3e7b94da1036652810d0facb5637c77 (patch) | |
tree | cfa6dd75e980475bb9e0a340a9506b7badee32b6 /generic | |
parent | b2e05bbf5179cd62e79db42bb597becc3340914a (diff) | |
download | tcl-15e9d469b3e7b94da1036652810d0facb5637c77.zip tcl-15e9d469b3e7b94da1036652810d0facb5637c77.tar.gz tcl-15e9d469b3e7b94da1036652810d0facb5637c77.tar.bz2 |
* tests/io.test, tests/chanio.test (io-73.1): Make sure to invalidate
* generic/tclIO.c (SetChannelFromAny): internal rep only after
validating channel rep. [Bug 1847044]
Diffstat (limited to 'generic')
-rw-r--r-- | generic/tclIO.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/generic/tclIO.c b/generic/tclIO.c index 0e8346d..4d723af 100644 --- a/generic/tclIO.c +++ b/generic/tclIO.c @@ -10,7 +10,7 @@ * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclIO.c,v 1.133 2007/12/05 21:47:26 hobbs Exp $ + * RCS: @(#) $Id: tclIO.c,v 1.134 2007/12/09 22:24:01 hobbs Exp $ */ #include "tclInt.h" @@ -10618,11 +10618,12 @@ SetChannelFromAny( if (objPtr->typePtr != &tclChannelType) { Tcl_Channel chan; - if (objPtr->typePtr != NULL) { - if (objPtr->bytes == NULL) { - objPtr->typePtr->updateStringProc(objPtr); - } - TclFreeIntRep(objPtr); + /* + * We need a valid string with which to check for a valid channel, but + * make sure not to free internal rep until validated. [Bug 1847044] + */ + if ((objPtr->typePtr != NULL) && (objPtr->bytes == NULL)) { + objPtr->typePtr->updateStringProc(objPtr); } chan = Tcl_GetChannel(interp, objPtr->bytes, NULL); @@ -10630,6 +10631,7 @@ SetChannelFromAny( return TCL_ERROR; } + TclFreeIntRep(objPtr); statePtr = ((Channel *)chan)->state; Tcl_Preserve((ClientData) statePtr); SET_CHANNELSTATE(objPtr, statePtr); |