diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2021-09-08 00:56:53 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2021-09-08 00:56:53 +0200 |
commit | 1c06ddd8bbbd6906e5bf00ec93e04d5090718be9 (patch) | |
tree | 92aaf06801f38754d41e039038d538959cefb866 | |
parent | 30af5938afad076e12b8ece123cab0b8bc92a596 (diff) |
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.c | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/shell/ash.c b/shell/ash.c index 5a18ff1a1..cf62fdf75 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; } |