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@xxxxxxxxxxxxxxxxxx> [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@xxxxxxxxxx> http://karelzak.blogspot.com