summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--generic/tclIO.c8
2 files changed, 14 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 4f102e0..52c5c5d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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();
}