From: Karel Zak <kzak@redhat.com>
To: Chris Hofstaedtler <zeha@debian.org>,
1003095@bugs.debian.org, util-linux@vger.kernel.org
Subject: Re: Bug#1003095: /usr/bin/script: hangs when child doesn't read input fast enough
Date: Wed, 5 Jan 2022 16:45:34 +0100 [thread overview]
Message-ID: <20220105154534.6es3dcg2upgzhezl@ws.net.home> (raw)
In-Reply-To: <20220104173124.lv2fyxuxuvc34jdo@tarta.nabijaczleweli.xyz>
On Tue, Jan 04, 2022 at 06:31:24PM +0100, наб wrote:
> Control: tags -1 + upstream
>
> On Tue, Jan 04, 2022 at 05:24:54PM +0100, Chris Hofstaedtler wrote:
> > * наб <nabijaczleweli@nabijaczleweli.xyz> [220104 00:06]:
> > > (This, at least, responds to ^\, but it also seems to function
> > > slightly differently. Also, this is a race and you're more
> > > likely to lose it under strace. The loopy thing seems
> > > like it's pretty good at hitting it 100% of the time.)
> As an additional note, because it's a race, if you're using bash,
> script < some-photo.jpeg
> also hangs, because setup takes long enough.
>
> > 1) is this Debian-specific or already present upstream?
> Debian doesn't patch script.c at all, so this is an upstream bug.
>
> > 2) did this work with previous versions of util-linux?
> The oldest one I fould from the site at Homepage: in d/control is
> "util-linux-ng 2.13", dated 19.1.2012. It's much closer to the original
> 4.4BSD-Lite implementation and still forks twice. As expected, testing
> reveals it does not have the bug.
>
> Performing a simple manual bisect across the versions available therein
> reveals that 2.25 is the first broken version. (Though, skimming the
> source, with a slightly different code path (select(2)?), since it still
> double-forks and is not so hard-stuck so as to be immune to ^\.)
>
> The first version that does get hard-stuck (because it forks once
> and only uses poll) is 2.27.
Resolve the problem with the signal should be simple. Now it
ignores all when it write to the master. Something like:
diff --git a/lib/pty-session.c b/lib/pty-session.c
index 6f038e1c5..84ea33860 100644
--- a/lib/pty-session.c
+++ b/lib/pty-session.c
@@ -292,7 +292,20 @@ static int write_output(char *obuf, ssize_t bytes)
static int write_to_child(struct ul_pty *pty, char *buf, size_t bufsz)
{
- return write_all(pty->master, buf, bufsz);
+ sigset_t set, org;
+ int rc;
+
+ sigemptyset(&set);
+ sigemptyset(&org);
+ sigaddset(&set, SIGINT);
+ sigaddset(&set, SIGTERM);
+
+ sigprocmask(SIG_UNBLOCK, &set, &org);
+
+ rc = write_all(pty->master, buf, bufsz);
+
+ sigprocmask(SIG_SETMASK, &org, NULL);
+ return rc;
}
--
Karel Zak <kzak@redhat.com>
http://karelzak.blogspot.com
next prev parent reply other threads:[~2022-01-05 15:45 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20220103230422.syzm2ryzcixuhl7r@tarta.nabijaczleweli.xyz>
2022-01-04 16:24 ` Bug#1003095: /usr/bin/script: hangs when child doesn't read input fast enough Chris Hofstaedtler
2022-01-04 17:31 ` наб
2022-01-05 15:45 ` Karel Zak [this message]
2022-01-08 14:54 ` наб
2022-01-13 23:28 ` наб
2022-02-02 14:49 ` наб
2022-02-03 10:55 ` Karel Zak
2022-04-07 14:22 ` наб
2022-04-11 10:08 ` Karel Zak
2022-04-12 14:25 ` наб
2022-04-19 10:36 ` Karel Zak
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=20220105154534.6es3dcg2upgzhezl@ws.net.home \
--to=kzak@redhat.com \
--cc=1003095@bugs.debian.org \
--cc=util-linux@vger.kernel.org \
--cc=zeha@debian.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.
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).