From a256b373624d3c6c6f38bce03b58cc38fab7e1e2 Mon Sep 17 00:00:00 2001 From: Herbert Xu Date: Tue, 28 Apr 2020 01:15:26 +1000 Subject: 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 Signed-off-by: Herbert Xu --- src/parser.c | 29 ++++++++++------------------- 1 file 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; @@ -685,16 +686,6 @@ parseheredoc(void) } } -STATIC int -peektoken(void) -{ - int t; - - t = readtoken(); - tokpushback++; - return (t); -} - STATIC int readtoken(void) { -- cgit 1.4.1