From f5a97b8269f11f63cf05cca1f31a08dc7567aeb9 Mon Sep 17 00:00:00 2001 From: Pádraig Brady Date: Tue, 8 Dec 2009 08:48:34 +0000 Subject: sort: fix failure if sort's parent has ignored SIGCHLD * src/sort.c (main): Reset the SIGCHLD handler to the default as otherwise wait() could return an error. * tests/misc/sort-compress: Set the CHLD handler in a subshell to SIG_IGN to ensure the sort command resets it to SIG_DFL. * NEWS: Mention the fix. --- NEWS | 5 +++++ src/sort.c | 1 + tests/misc/sort-compress | 11 ++++++++++- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 469865a6d..e30e7e5fd 100644 --- a/NEWS +++ b/NEWS @@ -13,6 +13,11 @@ GNU coreutils NEWS -*- outline -*- the presence of the empty string argument. [bug introduced in coreutils-8.0] + sort is now immune to the signal handling of its parent. + Specifically sort now doesn't exit with an error message + if it uses helper processes for compression and its parent + ignores CHLD signals. [bug introduced in coreutils-6.9] + 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] diff --git a/src/sort.c b/src/sort.c index 8709e5370..70e0bbbae 100644 --- a/src/sort.c +++ b/src/sort.c @@ -3254,6 +3254,7 @@ main (int argc, char **argv) } #endif } + signal (SIGCHLD, SIG_DFL); /* Don't inherit CHLD handling from parent. */ /* The signal mask is known, so it is safe to invoke exit_cleanup. */ atexit (exit_cleanup); diff --git a/tests/misc/sort-compress b/tests/misc/sort-compress index 7e4278e51..2711833b3 100755 --- a/tests/misc/sort-compress +++ b/tests/misc/sort-compress @@ -30,7 +30,6 @@ SORT="$abs_top_builddir/src/sort" # Ensure that $TMPDIR is valid. TMPDIR=.; export TMPDIR - # This should force the use of temp files sort -S 1k in > out || fail=1 compare exp out || fail=1 @@ -44,6 +43,16 @@ EOF chmod +x gzip +# Ensure `sort` 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 + + # This should force the use of child processes for "compression" + PATH=.:$PATH exec sort -S 1k --compress-program=gzip in > /dev/null +) || fail=1 + # This will find our new gzip in PATH PATH=.:$PATH sort -S 1k --compress-program=gzip in > out || fail=1 compare exp out || fail=1 -- cgit v1.2.3-54-g00ecf