diff options
-rw-r--r-- | NEWS | 3 | ||||
-rw-r--r-- | src/timeout.c | 1 | ||||
-rwxr-xr-x | tests/misc/timeout | 11 |
3 files changed, 14 insertions, 1 deletions
@@ -13,6 +13,9 @@ GNU coreutils NEWS -*- outline -*- the presence of the empty string argument. [bug introduced in coreutils-8.0] + timeout is now immune to the signal handling of its parent. + Specifically timeout now doesn't exit with an error message + if its parent ignores CHLD signals. [bug introduced in coreutils-7.6] * Noteworthy changes in release 8.1 (2009-11-18) [stable] diff --git a/src/timeout.c b/src/timeout.c index 3babb8c26..c7753d4d2 100644 --- a/src/timeout.c +++ b/src/timeout.c @@ -275,6 +275,7 @@ main (int argc, char **argv) install_signal_handlers (term_signal); signal (SIGTTIN, SIG_IGN); /* don't sTop if background child needs tty. */ signal (SIGTTOU, SIG_IGN); /* don't sTop if background child needs tty. */ + signal (SIGCHLD, SIG_DFL); /* Don't inherit CHLD handling from parent. */ monitored_pid = fork (); if (monitored_pid == -1) diff --git a/tests/misc/timeout b/tests/misc/timeout index 77a42053b..aae45f7f9 100755 --- a/tests/misc/timeout +++ b/tests/misc/timeout @@ -23,7 +23,6 @@ fi . $srcdir/test-lib.sh - # no timeout timeout 1 true || fail=1 @@ -42,4 +41,14 @@ test $? = 2 || fail=1 timeout 1 sleep 2 test $? = 124 || fail=1 +# Ensure `timeout` is immune to parent's SIGCHLD handler +# Use a subshell and an exec to work around a bug in FreeBSD 5.0 /bin/sh. +( + # ash doesn't support "trap '' CHLD"; it knows only signal numbers. + sig=`"$abs_top_builddir/src/kill" -l CHLD 2>/dev/null` && trap '' $sig + + # Before 2004-04-21, install would infloop, in the `while (wait...' loop: + exec timeout 1 true +) || fail=1 + Exit $fail |