Subject: When checking for std channels being closed, compare the channel state, not the channel itself so that stacked channels do not cause trouble.

From: "[email-masked]" <dgp>
Date: Wed, 3 Oct 2012 15:18:32 +0000

---
 ChangeLog       |  6 ++++++
 generic/tclIO.c | 44 ++++++++++++++++++++++++--------------------
 2 files changed, 30 insertions(+), 20 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index b8b9f2b..6f84707 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2012-10-03  Don Porter  <[email-masked]>
+
+	* generic/tclIO.c:	When checking for std channels being closed,
+	compare the channel state, not the channel itself so that stacked
+	channels do not cause trouble.
+
 2012-08-17  Jan Nijtmans  <[email-masked]>
 
 	* win/nmakehlp.c: Add "-V<num>" option, in order to be able
diff --git a/generic/tclIO.c b/generic/tclIO.c
index b9cd30c..eace472 100644
--- a/generic/tclIO.c
+++ b/generic/tclIO.c
@@ -697,26 +697,30 @@ CheckForStdChannelsBeingClosed(chan)
     ChannelState *statePtr = ((Channel *) chan)->state;
     ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
 
-    if ((chan == tsdPtr->stdinChannel) && (tsdPtr->stdinInitialized)) {
-        if (statePtr->refCount < 2) {
-            statePtr->refCount = 0;
-            tsdPtr->stdinChannel = NULL;
-            return;
-        }
-    } else if ((chan == tsdPtr->stdoutChannel)
-	    && (tsdPtr->stdoutInitialized)) {
-        if (statePtr->refCount < 2) {
-            statePtr->refCount = 0;
-            tsdPtr->stdoutChannel = NULL;
-            return;
-        }
-    } else if ((chan == tsdPtr->stderrChannel)
-	    && (tsdPtr->stderrInitialized)) {
-        if (statePtr->refCount < 2) {
-            statePtr->refCount = 0;
-            tsdPtr->stderrChannel = NULL;
-            return;
-        }
+    if (tsdPtr->stdinInitialized
+	    && tsdPtr->stdinChannel != NULL
+	    && statePtr == ((Channel *)tsdPtr->stdinChannel)->state) {
+	if (statePtr->refCount < 2) {
+	    statePtr->refCount = 0;
+	    tsdPtr->stdinChannel = NULL;
+	    return;
+	}
+    } else if (tsdPtr->stdoutInitialized
+	    && tsdPtr->stdoutChannel != NULL
+	    && statePtr == ((Channel *)tsdPtr->stdoutChannel)->state) {
+	if (statePtr->refCount < 2) {
+	    statePtr->refCount = 0;
+	    tsdPtr->stdoutChannel = NULL;
+	    return;
+	}
+    } else if (tsdPtr->stderrInitialized
+	    && tsdPtr->stderrChannel != NULL
+	    && statePtr == ((Channel *)tsdPtr->stderrChannel)->state) {
+	if (statePtr->refCount < 2) {
+	    statePtr->refCount = 0;
+	    tsdPtr->stderrChannel = NULL;
+	    return;
+	}
     }
 }
 
-- 
cgit v0.12