diff options
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | generic/tclIO.c | 8 |
2 files changed, 14 insertions, 2 deletions
@@ -1,3 +1,11 @@ +2005-11-18 Andreas Kupries <andreask@activestate.com> + + * 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. + 2005-11-18 Don Porter <dgp@users.sourceforge.net> * generic/tclListObj.c: Restored the SetListFromAny routine to diff --git a/generic/tclIO.c b/generic/tclIO.c index a449875..606ec75 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.100 2005/10/31 17:15:50 dgp Exp $ + * RCS: @(#) $Id: tclIO.c,v 1.101 2005/11/18 17:15:57 andreas_kupries Exp $ */ #include "tclInt.h" @@ -182,7 +182,6 @@ TclFinalizeIOSubsystem(void) for (statePtr = tsdPtr->firstCSPtr; statePtr != NULL; statePtr = nextCSPtr) { chanPtr = statePtr->topChanPtr; - nextCSPtr = statePtr->nextCSPtr; /* * Set the channel back into blocking mode to ensure that we wait for @@ -240,6 +239,11 @@ TclFinalizeIOSubsystem(void) chanPtr->instanceData = 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(); } |