Tcl Source Code

Artifact [4acae30d02]
Login

Artifact 4acae30d02d37f442f2d00d4aca8b103447b4d4f:

Attachment "pipe.84.udiff" to ticket [768659ffff] added by andreas_kupries 2006-03-15 06:34:26.
Index: ChangeLog
===================================================================
RCS file: /cvsroot/tcl/tcl/ChangeLog,v
retrieving revision 1.1453.2.608
diff -u -r1.1453.2.608 ChangeLog
--- ChangeLog	14 Mar 2006 22:51:07 -0000	1.1453.2.608
+++ ChangeLog	14 Mar 2006 23:33:25 -0000
@@ -1,5 +1,11 @@
 2006-03-14  Andreas Kupries <[email protected]>
 
+	* generic/tclPipe.c (TclCreatePipeline): Modified the processing
+	  of pipebars to fail if the last bar is followed only by
+	  redirections. [Bug 768659].
+
+2006-03-14  Andreas Kupries <[email protected]>
+
 	* doc/fconfigure.n: Clarified that -translation is binary is
 	  reported as lf when queried, because it is identical to lf,
 	  except for the special additional behaviour when setting
Index: generic/tclPipe.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclPipe.c,v
retrieving revision 1.7.2.4
diff -u -r1.7.2.4 tclPipe.c
--- generic/tclPipe.c	16 Jan 2006 19:31:18 -0000	1.7.2.4
+++ generic/tclPipe.c	14 Mar 2006 23:33:25 -0000
@@ -508,7 +508,7 @@
     int errorRelease = 0;
     CONST char *p;
     CONST char *nextArg;
-    int skip, lastBar, lastArg, i, j, atOK, flags, errorToOutput = 0;
+    int skip, lastBar, lastArg, i, j, atOK, flags, needCmd, errorToOutput = 0;
     Tcl_DString execBuffer;
     TclFile pipeIn;
     TclFile curInFile, curOutFile, curErrFile;
@@ -546,6 +546,7 @@
 
     lastBar = -1;
     cmdCount = 1;
+    needCmd = 1;
     for (i = 0; i < argc; i++) {
 	errorToOutput = 0;
 	skip = 0;
@@ -565,6 +566,7 @@
 	    }
 	    lastBar = i;
 	    cmdCount++;
+	    needCmd = 1;
 	    break;
 
 	case '<':
@@ -706,6 +708,11 @@
 		}
 	    }
 	    break;
+
+	default:
+	  /* Got a command word, not a redirection */
+	  needCmd = 0;
+	  break;
 	}
 
 	if (skip != 0) {
@@ -717,6 +724,15 @@
 	}
     }
 
+    if (needCmd) {
+        /* We had a bar followed only by redirections. */
+
+        Tcl_SetResult(interp,
+		      "illegal use of | or |& in command",
+		      TCL_STATIC);
+	goto error;
+    }
+
     if (inputFile == NULL) {
 	if (inputLiteral != NULL) {
 	    /*