Index: unix/tclUnixPipe.c
===================================================================
RCS file: /cvsroot/tcl/tcl/unix/tclUnixPipe.c,v
retrieving revision 1.48
diff -u -r1.48 tclUnixPipe.c
--- unix/tclUnixPipe.c	9 Jan 2009 11:21:46 -0000	1.48
+++ unix/tclUnixPipe.c	25 Jul 2009 23:03:50 -0000
@@ -451,23 +451,50 @@
     pid = fork();
     if (pid == 0) {
 	int joinThisError = errorFile && (errorFile == outputFile);
+	int fd0,fd1,fd2;
+	int closeOut=0,closeErr=0;
 
 	fd = GetFd(errPipeOut);
 
 	/*
 	 * Set up stdio file handles for the child process.
 	 */
+	fd0 = GetFd(inputFile);
+	fd1 = GetFd(outputFile);
+	fd2 = GetFd(outputFile);
+	
+	if (fd1 == 0) {
+	    outputFile = MakeFile(dup(0));
+	    closeOut = 1;
+        }
+	if (fd2 == 0) {
+	    errorFile = MakeFile(dup(0));
+	    closeErr = 1;
+        }
+	if (!SetupStdFile(inputFile, TCL_STDIN)) goto error;
+
+	if (fd2 == 1) {
+	    errorFile = MakeFile(dup(1));
+	    closeErr = 1;
+	}
+	if (!SetupStdFile(outputFile, TCL_STDOUT)) goto error;
 
-	if (!SetupStdFile(inputFile, TCL_STDIN)
-		|| !SetupStdFile(outputFile, TCL_STDOUT)
-		|| (!joinThisError && !SetupStdFile(errorFile, TCL_STDERR))
+	if (!joinThisError && !SetupStdFile(errorFile, TCL_STDERR)
 		|| (joinThisError &&
-			((dup2(1,2) == -1) || (fcntl(2, F_SETFD, 0) != 0)))) {
-	    sprintf(errSpace,
-		    "%dforked process couldn't set up input/output: ", errno);
-	    (void)write(fd, errSpace, (size_t) strlen(errSpace));
-	    _exit(1);
-	}
+		    ((dup2(1,2) == -1) || (fcntl(2, F_SETFD, 0) != 0))))
+	    goto error;
+
+	while(0)
+	    {
+	    error:
+		sprintf(errSpace,
+			"%dforked process couldn't set up input/output: ", errno);
+		(void)write(fd, errSpace, (size_t) strlen(errSpace));
+		_exit(1);
+	    }
+
+	if (closeOut) close(GetFd(outputFile));
+	if (closeErr) close(GetFd(errorFile));
 
 	/*
 	 * Close the input side of the error pipe.
