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:
parent
bb25e5ab00
commit
3cfb11c41a
@ -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;
|
||||
|
3
tools/regression/bin/sh/parser/empty-cmd1.0
Normal file
3
tools/regression/bin/sh/parser/empty-cmd1.0
Normal file
@ -0,0 +1,3 @@
|
||||
# $FreeBSD$
|
||||
|
||||
! (eval ': || f()') 2>/dev/null
|
Loading…
x
Reference in New Issue
Block a user