summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko2021-09-08 00:56:53 +0200
committerDenys Vlasenko2021-09-08 00:56:53 +0200
commit1c06ddd8bbbd6906e5bf00ec93e04d5090718be9 (patch)
tree92aaf06801f38754d41e039038d538959cefb866
parent30af5938afad076e12b8ece123cab0b8bc92a596 (diff)
downloadbusybox-1c06ddd8bbbd6906e5bf00ec93e04d5090718be9.zip
busybox-1c06ddd8bbbd6906e5bf00ec93e04d5090718be9.tar.gz
ash: parser: Save and restore heredoclist in expandstr
Upstream commit: Date: Sun, 17 May 2020 23:36:25 +1000 parser: Save and restore heredoclist in expandstr On Sun, May 17, 2020 at 01:19:28PM +0100, Harald van Dijk wrote: > This still does not restore the state completely. It does not clean up any > pending heredocs. I see: > > $ PS1='$(<<EOF "' > src/dash: 1: Syntax error: Unterminated quoted string > $(<<EOF ": > > > > That is, after entering the ':' command, the shell is still trying to read > the heredoc from the prompt. This patch saves and restores the heredoclist in expandstr. It also removes a bunch of unnecessary volatiles as those variables are only referenced in case of a longjmp other than one started by a signal like SIGINT. function old new delta expandstr 268 255 -13 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--shell/ash.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/shell/ash.c b/shell/ash.c
index 5a18ff1..cf62fdf 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -13359,23 +13359,26 @@ parseheredoc(void)
static const char *
expandstr(const char *ps, int syntax_type)
{
- union node n;
+ struct parsefile *file_stop;
+ struct jmploc *volatile savehandler;
+ struct heredoc *saveheredoclist;
+ const char *result;
int saveprompt;
- struct parsefile *file_stop = g_parsefile;
- volatile int saveint;
- struct jmploc *volatile savehandler = exception_handler;
struct jmploc jmploc;
- const char *volatile result;
+ union node n;
int err;
+ file_stop = g_parsefile;
+
/* XXX Fix (char *) cast. */
setinputstring((char *)ps);
+ saveheredoclist = heredoclist;
+ heredoclist = NULL;
saveprompt = doprompt;
doprompt = 0;
result = ps;
-
- SAVE_INT(saveint);
+ savehandler = exception_handler;
err = setjmp(jmploc.loc);
if (err)
goto out;
@@ -13402,11 +13405,11 @@ out:
exception_handler = savehandler;
if (err && exception_type != EXERROR)
longjmp(exception_handler->loc, 1);
- RESTORE_INT(saveint);
doprompt = saveprompt;
/* Try: PS1='`xxx(`' */
unwindfiles(file_stop);
+ heredoclist = saveheredoclist;
return result;
}