summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2020-04-28 01:15:26 +1000
committerHerbert Xu <herbert@gondor.apana.org.au>2020-05-15 16:24:37 +1000
commita256b373624d3c6c6f38bce03b58cc38fab7e1e2 (patch)
treeadcdd386cc7870f920a0cd6b48d6a6e976da0190
parent2a4f8f94a72413997ff98800fc6bf6bc028290a5 (diff)
downloaddash-a256b373624d3c6c6f38bce03b58cc38fab7e1e2.tar.gz
parser: Fix handling of empty aliases
Dash was incorrectly handling empty aliases. When attempting to use an empty alias with nothing else, I'm (incorrectly) prompted for more input: ``` $ alias empty='' $ empty > ``` Other shells (e.g., bash, yash) correctly handle the lone, empty alias as an empty command: ``` $ alias empty='' $ empty $ ``` The problem here is that we incorrectly enter the loop eating TNLs in readtoken(). This patch fixes it by setting checkkwd correctly. Reported-by: Michael Greenberg <michael.greenberg@pomona.edu> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r--src/parser.c29
1 files changed, 10 insertions, 19 deletions
diff --git a/src/parser.c b/src/parser.c
index b318b08..5c9e9a0 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -115,7 +115,6 @@ STATIC union node *simplecmd(void);
STATIC union node *makename(void);
STATIC void parsefname(void);
STATIC void parseheredoc(void);
-STATIC int peektoken(void);
STATIC int readtoken(void);
STATIC int xxreadtoken(void);
STATIC int pgetc_eatbnl();
@@ -161,21 +160,23 @@ parsecmd(int interact)
STATIC union node *
list(int nlflag)
{
+ int chknl = nlflag & 1 ? 0 : CHKNL;
union node *n1, *n2, *n3;
int tok;
n1 = NULL;
for (;;) {
- switch (readtoken()) {
+ checkkwd = chknl | CHKKWD | CHKALIAS;
+ tok = readtoken();
+ switch (tok) {
case TNL:
- if (!(nlflag & 1))
- break;
parseheredoc();
return n1;
case TEOF:
- if (!n1 && (nlflag & 1))
+ if (!n1 && !chknl)
n1 = NEOF;
+out_eof:
parseheredoc();
tokpushback++;
lasttoken = TEOF;
@@ -183,8 +184,7 @@ list(int nlflag)
}
tokpushback++;
- checkkwd = CHKNL | CHKKWD | CHKALIAS;
- if (nlflag == 2 && tokendlist[peektoken()])
+ if (nlflag == 2 && tokendlist[tok])
return n1;
nlflag |= 2;
@@ -214,15 +214,16 @@ list(int nlflag)
n1 = n3;
}
switch (tok) {
- case TNL:
case TEOF:
+ goto out_eof;
+ case TNL:
tokpushback++;
/* fall through */
case TBACKGND:
case TSEMI:
break;
default:
- if ((nlflag & 1))
+ if (!chknl)
synexpect(-1);
tokpushback++;
return n1;
@@ -686,16 +687,6 @@ parseheredoc(void)
}
STATIC int
-peektoken(void)
-{
- int t;
-
- t = readtoken();
- tokpushback++;
- return (t);
-}
-
-STATIC int
readtoken(void)
{
int t;