diff options
author | andreas_kupries <andreas_kupries@noemail.net> | 2005-11-18 17:14:51 (GMT) |
---|---|---|
committer | andreas_kupries <andreas_kupries@noemail.net> | 2005-11-18 17:14:51 (GMT) |
commit | 28edd866632c19f59a5106ee2060cca827351699 (patch) | |
tree | 41cfa97f7439d0cf8be97a321fd3cbcd1478a0a2 /generic/tclIO.c | |
parent | b225833606b5327333746758e123cee46e3fe812 (diff) | |
download | tcl-28edd866632c19f59a5106ee2060cca827351699.zip tcl-28edd866632c19f59a5106ee2060cca827351699.tar.gz tcl-28edd866632c19f59a5106ee2060cca827351699.tar.bz2 |
* generic/tclIO.c (TclFinalizeIOSubsystem): Applied Pat Thoyts'
patch for [SF Tcl Bug 1359094]. This moves the retrieval of the
next channel state to the end of the loop, as the called
closeproc may close other channels, i.e. modify the list we are
iterating, invalidating any pointer retrieved earlier.
FossilOrigin-Name: e8ea129e06f6d7cc70f69e4f09cc2858c9c7b3be
Diffstat (limited to 'generic/tclIO.c')
-rw-r--r-- | generic/tclIO.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/generic/tclIO.c b/generic/tclIO.c index 4cf62ad..0c56c12 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.61.2.15 2005/10/14 17:12:32 vasiljevic Exp $ + * RCS: @(#) $Id: tclIO.c,v 1.61.2.16 2005/11/18 17:14:52 andreas_kupries Exp $ */ #include "tclInt.h" @@ -210,7 +210,6 @@ TclFinalizeIOSubsystem() for (statePtr = tsdPtr->firstCSPtr; statePtr != (ChannelState *) NULL; statePtr = nextCSPtr) { chanPtr = statePtr->topChanPtr; - nextCSPtr = statePtr->nextCSPtr; /* * Set the channel back into blocking mode to ensure that we wait @@ -273,6 +272,11 @@ TclFinalizeIOSubsystem() chanPtr->instanceData = (ClientData) NULL; statePtr->flags |= CHANNEL_DEAD; } + /* + * We look for the next pointer now in case we had one closed on up during + * the current channel's closeproc. (eg: rechan extension). [PT] + */ + nextCSPtr = statePtr->nextCSPtr; } TclpFinalizePipes(); } |