Tcl Source Code

Artifact [e07a6945b2]
Login

Artifact e07a6945b29a1b5d47e95d3b212d722652078c5d:

Attachment "419685.diff" to ticket [419685ffff] added by andreas_kupries 2001-08-25 06:27:42.
Index: ChangeLog
===================================================================
RCS file: /cvsroot/tcl/tcl/ChangeLog,v
retrieving revision 1.540
diff -u -r1.540 ChangeLog
--- ChangeLog	2001/08/24 16:46:46	1.540
+++ ChangeLog	2001/08/24 23:17:13
@@ -1,3 +1,13 @@
+2001-08-24  Andreas Kupries <[email protected]>
+
+	* generic/tclIO.c (Tcl_GetStdChannel): Moved setting the
+	  '*Initialized'-flags into the conditionals below them. IOW, the
+	  flags are set only if the standard channels could actually be
+	  initialized to their defaults. If that was impossible, for
+	  example when running as a Windows NT service, the standard
+	  channels stay uninitialized and the next three channels are
+	  *not* made into standard channels [419685].
+
 2001-08-24 Vince Darley <[email protected]>
 
 	* doc/glob.n: documented windows-style path issue with glob.
Index: generic/tclIO.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclIO.c,v
retrieving revision 1.34
diff -u -r1.34 tclIO.c
--- generic/tclIO.c	2001/08/23 17:37:07	1.34
+++ generic/tclIO.c	2001/08/24 23:17:13
@@ -347,7 +347,6 @@
 	case TCL_STDIN:
 	    if (!tsdPtr->stdinInitialized) {
 		tsdPtr->stdinChannel = TclpGetDefaultStdChannel(TCL_STDIN);
-		tsdPtr->stdinInitialized = 1;
 
 		/*
                  * Artificially bump the refcount to ensure that the channel
@@ -359,6 +358,14 @@
                  */
 
                 if (tsdPtr->stdinChannel != (Tcl_Channel) NULL) {
+		    /*
+		     * Note that we are not allowed to move this
+		     * assignment behind Tcl_RegisterChannel or we
+		     * will create an infinite recursion through
+		     * Tcl_RegisterChannel - GetChannelTable -
+		     * and Tcl_GetStdChannel.
+		     */
+		    tsdPtr->stdinInitialized = 1;
                     (void) Tcl_RegisterChannel((Tcl_Interp *) NULL,
                             tsdPtr->stdinChannel);
                 }
@@ -368,8 +375,8 @@
 	case TCL_STDOUT:
 	    if (!tsdPtr->stdoutInitialized) {
 		tsdPtr->stdoutChannel = TclpGetDefaultStdChannel(TCL_STDOUT);
-		tsdPtr->stdoutInitialized = 1;
                 if (tsdPtr->stdoutChannel != (Tcl_Channel) NULL) {
+		    tsdPtr->stdoutInitialized = 1;
                     (void) Tcl_RegisterChannel((Tcl_Interp *) NULL,
                             tsdPtr->stdoutChannel);
                 }
@@ -379,8 +386,8 @@
 	case TCL_STDERR:
 	    if (!tsdPtr->stderrInitialized) {
 		tsdPtr->stderrChannel = TclpGetDefaultStdChannel(TCL_STDERR);
-		tsdPtr->stderrInitialized = 1;
                 if (tsdPtr->stderrChannel != (Tcl_Channel) NULL) {
+		    tsdPtr->stderrInitialized = 1;
                     (void) Tcl_RegisterChannel((Tcl_Interp *) NULL,
                             tsdPtr->stderrChannel);
                 }