dash.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [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).