summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2012-10-03 15:22:15 (GMT)
committerdgp <dgp@users.sourceforge.net>2012-10-03 15:22:15 (GMT)
commit570d1f597600fd4e019636e74fc5d1a74bc0b53e (patch)
tree9663b779f37892532c8ea60a31c80b4a68e6a1f1
parent087231e55e5ff1f00a7c61f88faac65f8155f504 (diff)
downloadtcl-570d1f597600fd4e019636e74fc5d1a74bc0b53e.zip
tcl-570d1f597600fd4e019636e74fc5d1a74bc0b53e.tar.gz
tcl-570d1f597600fd4e019636e74fc5d1a74bc0b53e.tar.bz2
When checking for std channels being closed, compare the channel state,
not the channel itself so that stacked channels do not cause trouble.
-rw-r--r--ChangeLog6
-rw-r--r--generic/tclIO.c44
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 <dgp@users.sourceforge.net>
+
+ * 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 <nijtmans@users.sf.net>
* 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;
+ }
}
}