zsh-workers
 help / color / mirror / code / Atom feed
From: Bart Schaefer <schaefer@brasslantern.com>
To: "Mark J. Reed" <markjreed@gmail.com>
Cc: zsh-workers@zsh.org
Subject: Re: Bug: reading from tty inside process substitution
Date: Tue, 14 Nov 2023 20:42:40 -0800	[thread overview]
Message-ID: <CAH+w=7abshTC3bJC6YRJOszsyzJEHbBLYZafzdGd4p8J8LK5xg@mail.gmail.com> (raw)
In-Reply-To: <CAH+w=7ZVJeo==zJjUi7OaUWt5nRqhif2ApTk5z5a0PD9mONc4Q@mail.gmail.com>

On Tue, Nov 14, 2023 at 7:33 PM Bart Schaefer <schaefer@brasslantern.com> wrote:
>
> > read foo < <(read bar; echo $bar) </dev/tty
>
> That still doesn't respond to interrupts

So what seems to be going on here is that the shell enters
waitonejob() via waitjobs() from execpline().  At that point it has a
nonzero auxprocs pointer, so it calls zwaitjob() which for the same
reason eventually calls signal_suspend(SIGCHLD), which adds SIGINT to
the ignored signals to allow the presumed foreground child to handle
the signal.

The problem is that by that point the auxiliary "foreground" process
-- the process substitution -- has already exited.  It was promptly
reaped, but zwaitjob() is in a loop waiting with SIGINT still blocked
for the parent's jn->stat to be updated to either 0 or STAT_DONE.
Trouble is, that parent is the multio loop, which is actively skipping
over interrupts and won't quit until EOF.

What about the following?  Is there some simple way to check that the
multio tty is the same tty as SHIN ?  Also, even with this in place,
something is still ignoring TSTP (^z), perhaps because "read foo" is
in the top-level interactive shell, so this can't be suspended.

diff --git a/Src/exec.c b/Src/exec.c
index 285d2c5ad..97823760f 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -2309,7 +2309,7 @@ closemn(struct multio **mfds, int fd, int type)
         for (i = 0; i < mn->ct; i++)
         while ((len = read(mn->fds[i], buf, TCBUFSIZE)) != 0) {
             if (len < 0) {
-            if (errno == EINTR)
+            if (errno == EINTR && !isatty(mn->fds[i]))
                 continue;
             else
                 break;

(This patch may not apply cleanly due to gmail ... I'll prepare a
proper one if deemed OK.)


  reply	other threads:[~2023-11-15  4:43 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-11-12 15:59 Mark J. Reed
2023-11-12 18:09 ` Bart Schaefer
2023-11-12 21:50   ` Bart Schaefer
2023-11-15  3:33   ` Bart Schaefer
2023-11-15  4:42     ` Bart Schaefer [this message]
2023-11-15  5:00       ` Bart Schaefer
2023-11-16  4:58         ` Bart Schaefer
2023-11-17  1:27           ` [PATCH] reading from large or "infinite" source in multio Bart Schaefer
2023-11-18 23:24             ` Bart Schaefer
2023-11-16  2:35       ` [PATCH] reading from tty inside process substitution Bart Schaefer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAH+w=7abshTC3bJC6YRJOszsyzJEHbBLYZafzdGd4p8J8LK5xg@mail.gmail.com' \
    --to=schaefer@brasslantern.com \
    --cc=markjreed@gmail.com \
    --cc=zsh-workers@zsh.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

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).