sh: Disallow empty simple commands.

As per POSIX, a simple command must have at least one redirection,
assignment word or command word.

These occured in rare cases such as  eval "f()" .

The extension of allowing no commands inside { }, if, while, for, etc.
remains.
This commit is contained in:
Jilles Tjoelker 2013-08-25 10:57:48 +00:00
parent bb25e5ab00
commit 3cfb11c41a
2 changed files with 7 additions and 8 deletions

View File

@ -573,7 +573,7 @@ TRACE(("expecting DO got %s %s\n", tokname[got], got == TWORD ? wordtext : ""));
synexpect(TEND);
checkkwd = CHKKWD | CHKALIAS;
break;
/* Handle an empty command like other simple commands. */
/* A simple command must have at least one redirection or word. */
case TBACKGND:
case TSEMI:
case TAND:
@ -581,16 +581,12 @@ TRACE(("expecting DO got %s %s\n", tokname[got], got == TWORD ? wordtext : ""));
case TPIPE:
case TENDCASE:
case TFALLTHRU:
/*
* An empty command before a ; doesn't make much sense, and
* should certainly be disallowed in the case of `if ;'.
*/
case TEOF:
case TNL:
case TRP:
if (!redir)
synexpect(-1);
case TNL:
case TEOF:
case TWORD:
case TRP:
tokpushback++;
n1 = simplecmd(rpp, redir);
return n1;

View File

@ -0,0 +1,3 @@
# $FreeBSD$
! (eval ': || f()') 2>/dev/null