* [BUG] Here-document redirection with vi/emacs on
@ 2017-06-27 14:29 Zando Fardones
2017-06-29 23:33 ` Harald van Dijk
0 siblings, 1 reply; 2+ messages in thread
From: Zando Fardones @ 2017-06-27 14:29 UTC (permalink / raw)
To: dash
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. Please take a
look:
$ set -o vi
$ cat << EOF
> test
> EOF
$ set +o vi
$ cat << EOF
> test
> EOF
test
^ you can see the "test" output only when the vi option is *not* set
$ set -o emacs
$ cat << EOF
> test
> EOF
$ set +o emacs
$ cat << EOF
> test
> EOF
test
^ you can see the "test" output only when the emacs option is *not* set
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [BUG] Here-document redirection with vi/emacs on
2017-06-27 14:29 [BUG] Here-document redirection with vi/emacs on Zando Fardones
@ 2017-06-29 23:33 ` Harald van Dijk
0 siblings, 0 replies; 2+ messages in thread
From: Harald van Dijk @ 2017-06-29 23:33 UTC (permalink / raw)
To: Zando Fardones, dash
[-- Attachment #1: Type: text/plain, Size: 962 bytes --]
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
[-- Attachment #2: dash-libedit-heredoc.patch --]
[-- Type: text/x-patch, Size: 345 bytes --]
--- a/src/input.c
+++ b/src/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 {
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2017-06-29 23:33 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-06-27 14:29 [BUG] Here-document redirection with vi/emacs on Zando Fardones
2017-06-29 23:33 ` Harald van Dijk
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).