diff options
author | Denys Vlasenko | 2020-02-22 17:26:23 +0100 |
---|---|---|
committer | Denys Vlasenko | 2020-02-22 17:26:23 +0100 |
commit | c08993f40c0c6c7bdf453e77c3aa9dae8ec0dad9 (patch) | |
tree | 01a44b93192180ac09ba94016f05e9ba8db15fc9 /shell/ash.c | |
parent | 9a1a659707a18c29166c3e2977523102866d7aed (diff) | |
download | busybox-c08993f40c0c6c7bdf453e77c3aa9dae8ec0dad9.zip busybox-c08993f40c0c6c7bdf453e77c3aa9dae8ec0dad9.tar.gz |
ash: parser: Do not push token back before parseheredoc
Upstream commit:
Date: Mon, 19 Nov 2018 18:43:58 +0800
parser: Do not push token back before parseheredoc
When we read the first token in list() we use peektoken instead
of readtoken as the following code needs to use the same token
again. However, this is wrong when we're in a here-document as
it will clobber the saved token without resetting the tokpushback
flag.
This patch fixes it by doing the tokpushback after parseheredoc
and setting lasttoken again if parseheredoc was called.
Reported-by: Ron Yorston <rmy@frippery.org>
Fixes: 7c245aa8ed33 ("[PARSER] Simplify EOF/newline handling in...")
Fixes: ee5cbe9fd6bc ("[SHELL] Optimize dash -c "command" to avoid a fork")
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Tested-by: Simon Ser <contact@emersion.fr>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'shell/ash.c')
-rw-r--r-- | shell/ash.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/shell/ash.c b/shell/ash.c index 83cac3f..5fb67c0 100644 --- a/shell/ash.c +++ b/shell/ash.c @@ -11607,7 +11607,7 @@ list(int nlflag) n1 = NULL; for (;;) { - switch (peektoken()) { + switch (readtoken()) { case TNL: if (!(nlflag & 1)) break; @@ -11618,9 +11618,12 @@ list(int nlflag) if (!n1 && (nlflag & 1)) n1 = NODE_EOF; parseheredoc(); + tokpushback++; + lasttoken = TEOF; return n1; } + tokpushback++; checkkwd = CHKNL | CHKKWD | CHKALIAS; if (nlflag == 2 && ((1 << peektoken()) & tokendlist)) return n1; |