[git commit] ash: parser: Do not push token back before parseheredoc

Denys Vlasenko vda.linux at googlemail.com
Sat Feb 22 16:26:23 UTC 2020


commit: https://git.busybox.net/busybox/commit/?id=c08993f40c0c6c7bdf453e77c3aa9dae8ec0dad9
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

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 at 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 at gondor.apana.org.au>
    Tested-by: Simon Ser <contact at emersion.fr>

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 shell/ash.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/shell/ash.c b/shell/ash.c
index 83cac3fb0..5fb67c0fa 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;


More information about the busybox-cvs mailing list