From: Denys Vlasenko Date: Mon, 17 Feb 2020 11:11:26 +0000 (+0100) Subject: ash: parser: Save/restore here-documents in command substitution X-Git-Tag: 1_32_0~67 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=74aaf05170d6f224194c98ee0434e2decae45735;p=oweals%2Fbusybox.git ash: parser: Save/restore here-documents in command substitution Upstream comment: Date: Sat, 19 May 2018 02:39:42 +0800 parser: Save/restore here-documents in command substitution This patch changes the parsing of here-documents within command substitution, both old style and new style. In particular, the original here-document list is saved upon the beginning of parsing command substitution and restored when exiting. This means that here-documents outside of command substitution can no longer be filled by text within it and vice-versa. Signed-off-by: Herbert Xu Signed-off-by: Denys Vlasenko --- diff --git a/shell/ash.c b/shell/ash.c index fbe8dd9e4..e0ddf7198 100644 --- a/shell/ash.c +++ b/shell/ash.c @@ -12733,6 +12733,7 @@ parsebackq: { union node *n; char *str; size_t savelen; + struct heredoc *saveheredoclist; smallint saveprompt = 0; str = NULL; @@ -12808,6 +12809,9 @@ parsebackq: { *nlpp = stzalloc(sizeof(**nlpp)); /* (*nlpp)->next = NULL; - stzalloc did it */ + saveheredoclist = heredoclist; + heredoclist = NULL; + if (oldstyle) { saveprompt = doprompt; doprompt = 0; @@ -12817,18 +12821,21 @@ parsebackq: { if (oldstyle) doprompt = saveprompt; - else if (readtoken() != TRP) - raise_error_unexpected_syntax(TRP); + else { + if (readtoken() != TRP) + raise_error_unexpected_syntax(TRP); + setinputstring(nullstr); + parseheredoc(); + } + + heredoclist = saveheredoclist; (*nlpp)->n = n; - if (oldstyle) { - /* - * Start reading from old file again, ignoring any pushed back - * tokens left from the backquote parsing - */ - popfile(); + /* Start reading from old file again. */ + popfile(); + /* Ignore any pushed back tokens left from the backquote parsing. */ + if (oldstyle) tokpushback = 0; - } while (stackblocksize() <= savelen) growstackblock(); STARTSTACKSTR(out);