summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2020-05-17 23:36:25 +1000
committerHerbert Xu <herbert@gondor.apana.org.au>2020-05-28 21:34:15 +1000
commitec7fc7c7e33b06f31d21bbc03bf81290fd0c7742 (patch)
tree7fce7501dee69b82e1a8412dfa0b7d3ba002ad75
parent3e3e7af1a49273a5e49d50565b3b079a2ab19142 (diff)
downloaddash-ec7fc7c7e33b06f31d21bbc03bf81290fd0c7742.tar.gz
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. Reported-by: Harald van Dijk <harald@gigawatt.nl> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r--src/parser.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/src/parser.c b/src/parser.c
index 3131045..54c2861 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -1565,10 +1565,11 @@ setprompt(int which)
const char *
expandstr(const char *ps)
{
- struct parsefile *volatile file_stop;
+ struct parsefile *file_stop;
struct jmploc *volatile savehandler;
- const char *volatile result;
- volatile int saveprompt;
+ struct heredoc *saveheredoclist;
+ const char *result;
+ int saveprompt;
struct jmploc jmploc;
union node n;
int err;
@@ -1578,6 +1579,8 @@ expandstr(const char *ps)
/* XXX Fix (char *) cast. */
setinputstring((char *)ps);
+ saveheredoclist = heredoclist;
+ heredoclist = NULL;
saveprompt = doprompt;
doprompt = 0;
result = ps;
@@ -1603,6 +1606,7 @@ out:
doprompt = saveprompt;
unwindfiles(file_stop);
+ heredoclist = saveheredoclist;
return result;
}