sh: Error out on various specials/keywords in the wrong place in backticks.

Example:
  echo `date)`

Exp-run done by:	pav (with some other sh(1) changes)
Obtained from:		NetBSD (Christos Zoulas, NetBSD PR 11317)
This commit is contained in:
Jilles Tjoelker 2010-10-29 20:23:41 +00:00
parent 60f7eec450
commit 33582ce055

View File

@ -106,7 +106,7 @@ static struct parser_temp *parser_temp;
static int noaliases = 0;
static union node *list(int);
static union node *list(int, int);
static union node *andor(void);
static union node *pipeline(void);
static union node *command(void);
@ -220,12 +220,12 @@ parsecmd(int interact)
if (t == TNL)
return NULL;
tokpushback++;
return list(1);
return list(1, 0);
}
static union node *
list(int nlflag)
list(int nlflag, int erflag)
{
union node *n1, *n2, *n3;
int tok;
@ -287,7 +287,7 @@ list(int nlflag)
pungetc(); /* push back EOF on input */
return n1;
default:
if (nlflag)
if (nlflag || erflag)
synexpect(-1);
tokpushback++;
return n1;
@ -398,24 +398,24 @@ command(void)
case TIF:
n1 = (union node *)stalloc(sizeof (struct nif));
n1->type = NIF;
if ((n1->nif.test = list(0)) == NULL)
if ((n1->nif.test = list(0, 0)) == NULL)
synexpect(-1);
if (readtoken() != TTHEN)
synexpect(TTHEN);
n1->nif.ifpart = list(0);
n1->nif.ifpart = list(0, 0);
n2 = n1;
while (readtoken() == TELIF) {
n2->nif.elsepart = (union node *)stalloc(sizeof (struct nif));
n2 = n2->nif.elsepart;
n2->type = NIF;
if ((n2->nif.test = list(0)) == NULL)
if ((n2->nif.test = list(0, 0)) == NULL)
synexpect(-1);
if (readtoken() != TTHEN)
synexpect(TTHEN);
n2->nif.ifpart = list(0);
n2->nif.ifpart = list(0, 0);
}
if (lasttoken == TELSE)
n2->nif.elsepart = list(0);
n2->nif.elsepart = list(0, 0);
else {
n2->nif.elsepart = NULL;
tokpushback++;
@ -429,13 +429,13 @@ command(void)
int got;
n1 = (union node *)stalloc(sizeof (struct nbinary));
n1->type = (lasttoken == TWHILE)? NWHILE : NUNTIL;
if ((n1->nbinary.ch1 = list(0)) == NULL)
if ((n1->nbinary.ch1 = list(0, 0)) == NULL)
synexpect(-1);
if ((got=readtoken()) != TDO) {
TRACE(("expecting DO got %s %s\n", tokname[got], got == TWORD ? wordtext : ""));
synexpect(TDO);
}
n1->nbinary.ch2 = list(0);
n1->nbinary.ch2 = list(0, 0);
if (readtoken() != TDONE)
synexpect(TDONE);
checkkwd = 1;
@ -487,7 +487,7 @@ TRACE(("expecting DO got %s %s\n", tokname[got], got == TWORD ? wordtext : ""));
t = TEND;
else
synexpect(-1);
n1->nfor.body = list(0);
n1->nfor.body = list(0, 0);
if (readtoken() != t)
synexpect(t);
checkkwd = 1;
@ -527,7 +527,7 @@ TRACE(("expecting DO got %s %s\n", tokname[got], got == TWORD ? wordtext : ""));
ap->narg.next = NULL;
if (lasttoken != TRP)
noaliases = 0, synexpect(TRP);
cp->nclist.body = list(0);
cp->nclist.body = list(0, 0);
checkkwd = 2;
if ((t = readtoken()) != TESAC) {
@ -545,14 +545,14 @@ TRACE(("expecting DO got %s %s\n", tokname[got], got == TWORD ? wordtext : ""));
case TLP:
n1 = (union node *)stalloc(sizeof (struct nredir));
n1->type = NSUBSHELL;
n1->nredir.n = list(0);
n1->nredir.n = list(0, 0);
n1->nredir.redirect = NULL;
if (readtoken() != TRP)
synexpect(TRP);
checkkwd = 1;
break;
case TBEGIN:
n1 = list(0);
n1 = list(0, 0);
if (readtoken() != TEND)
synexpect(TEND);
checkkwd = 1;
@ -1066,7 +1066,7 @@ parsebackq(char *out, struct nodelist **pbqlist,
doprompt = 0;
}
n = list(0);
n = list(0, oldstyle);
if (oldstyle)
doprompt = saveprompt;