diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2020-04-28 01:15:26 +1000 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2020-05-15 16:24:37 +1000 |
commit | a256b373624d3c6c6f38bce03b58cc38fab7e1e2 (patch) | |
tree | adcdd386cc7870f920a0cd6b48d6a6e976da0190 | |
parent | jobs: Fix infinite loop in waitproc (diff) | |
download | dash-a256b373624d3c6c6f38bce03b58cc38fab7e1e2.tar.gz dash-a256b373624d3c6c6f38bce03b58cc38fab7e1e2.zip |
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.c | 29 |
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; |