Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Command line bug since zsh 3.1.7...



On Wed, 29 Sep 2004, Bart Schaefer wrote:

> On Wed, 29 Sep 2004, Sebastian Rasmussen wrote:
> 
> > hal9000% zsh -c 'echo bar |'
> > zsh: segmentation fault  zsh -c 'echo bar |'
> 
> Seems to be this easy

The following might be a more palatable fix, as it produces a parse error
rather than silently treating the '|' as a ';'.  This is still not the
same as bash (which says "unexpected end of file") but arguably "syntax
error near `|'" is a more helpful error anyway.

There are still other cases where zsh doesn't crash, but doesn't produce
an error either.  E.g. (even without the following patch):

schaefer[643] bash -c 'echo |{;}'
bash: syntax error near unexpected token `;}'
bash: -c: line 1: `echo |{;}'
schaefer[644] Src/zsh -fc 'echo |{;}'
schaefer[645] 

(Perhaps the patch should set tok = LEXERR only when tok == ENDINPUT ?
I couldn't decide.)

Index: Src/parse.c
===================================================================
RCS file: /extra/cvsroot/zsh/zsh-4.0/Src/parse.c,v
retrieving revision 1.20
diff -c -r1.20 parse.c
--- parse.c	14 Aug 2004 05:01:23 -0000	1.20
+++ parse.c	30 Sep 2004 04:01:06 -0000
@@ -729,7 +729,9 @@
 	ecbuf[p] = WCB_PIPE(WC_PIPE_MID, (line >= 0 ? line + 1 : 0));
 	ecispace(p + 1, 1);
 	ecbuf[p + 1] = ecused - 1 - p;
-	par_pline(complex);
+	if (!par_pline(complex)) {
+	    tok = LEXERR;
+	}
 	cmdpop();
 	return 1;
     } else if (tok == BARAMP) {
@@ -750,7 +752,9 @@
 	ecbuf[p] = WCB_PIPE(WC_PIPE_MID, (line >= 0 ? line + 1 : 0));
 	ecispace(p + 1, 1);
 	ecbuf[p + 1] = ecused - 1 - p;
-	par_pline(complex);
+	if (!par_pline(complex)) {
+	    tok = LEXERR;
+	}
 	cmdpop();
 	return 1;
     } else {



Messages sorted by: Reverse Date, Date, Thread, Author