aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald van Dijk <harald@gigawatt.nl>2017-06-30 01:33:29 +0200
committerBen Hutchings <ben@decadent.org.uk>2020-03-28 21:42:54 +0000
commitc1ef04b089e914b55a069d5bdfac8a3b37cda172 (patch)
tree87a3089141c05cc054db06bdb2d5296a112d8d56
parentae4ebb19df70ec73eb3ae9721762d40dd6bd3d1f (diff)
downloadklibc-c1ef04b089e914b55a069d5bdfac8a3b37cda172.tar.gz
[klibc] dash: input: Fix here-document redirection with vi/emacs on
[ dash commit 7f31919cba4b17af883db77f99bfa974f0821361 ] On 27/06/17 16:29, Zando Fardones wrote: > Hello, > > I think I've found a bug when using the here-document redirection in > an interactive shell. What basically happens is that you can't see the > command output if you set the "vi" or "emacs" options. That's not quite what happens: the here-document contents got lost, so there is no command output to see. Nice find. The problem is that getprompt() is implicitly called by el_gets(). This messes with the memory used by the parser to store the here-document's contents. In the non-emacs/vi case, the prompt is explicitly written by setprompt(), which wraps the getprompt() call in a pushstackmark()/popstackmark() pair to restore the state so that parsing can continue. But when getprompt() is called by el_gets(), it knows nothing about this. The whole call to el_gets() can be surrounded by another pushstackmark()/popstackmark() pair to solve the problem, as attached. Cheers, Harald van Dijk Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
-rw-r--r--usr/dash/input.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/usr/dash/input.c b/usr/dash/input.c
index 06c08d49b3d76..e53423c55c4b4 100644
--- a/usr/dash/input.c
+++ b/usr/dash/input.c
@@ -147,8 +147,12 @@ retry:
static const char *rl_cp;
static int el_len;
- if (rl_cp == NULL)
+ if (rl_cp == NULL) {
+ struct stackmark smark;
+ pushstackmark(&smark, stackblocksize());
rl_cp = el_gets(el, &el_len);
+ popstackmark(&smark);
+ }
if (rl_cp == NULL)
nr = 0;
else {