[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Bizarre interaction bug involving bash w/ lastpipe + Almquist 'wait'

From: Harald van Dijk
Subject: Re: Bizarre interaction bug involving bash w/ lastpipe + Almquist 'wait'
Date: Thu, 6 Feb 2020 19:29:41 +0000
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:73.0) Gecko/20100101 Thunderbird/73.0

On 06/02/2020 16:12, Martijn Dekker wrote:
This is probably the strangest bug (or maybe pair of bugs) I've run into in nearly five years of breaking shells by developing modernish.

I've traced it to an interaction between bash >= 4.2 (i.e.: bash with shopt -s lastpipe) and variants of the Almquist shell, at least: dash, gwsh, Busybox ash, FreeBSD sh, and NetBSD 9.0rc2 sh.

Symptom: if 'return' is invoked on bash in the last element of a pipe executed in the main shell environment, then if you subsequently 'exec' an Almquist shell variant so that it has the same PID, its 'wait' builtin breaks.

I can consistently reproduce this on Linux, macOS, FreeBSD, NetBSD 9.0rc2, OpenBSD, and Solaris.

To reproduce this, you need bash >= 4.2, some Almquist shell variant, and these two test scripts:

---begin test.bash---
fn() {
     : | return
shopt -s lastpipe || exit
exec "${1:-dash}" test.ash
---end test.bash---

---begin test.ash---
echo '*ash-begin'
: &
echo '*ash-middle'
wait "$!"
echo '*ash-end'
---end test.ash---

When executing test.bash with dash, gwsh, Busybox ash, or FreeBSD sh, then test.ash simply waits forever on executing 'wait "$!"'.

Nice test. bash leaves the process in a state where SIGCHLD is blocked, and the various ash-based shells do not unblock it. Because of that, they do not pick up on the fact that the child process has terminated. I would consider this a bug both in bash and in the ash-based shells.

Harald van Dijk

reply via email to

[Prev in Thread] Current Thread [Next in Thread]