summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPádraig Brady <P@draigBrady.com>2011-05-19 23:23:23 +0100
committerPádraig Brady <P@draigBrady.com>2011-05-26 00:10:32 +0100
commit5908e29e825286121c69f5c10c313ccae6860fa7 (patch)
tree27612890659fa217afe24a0ffd314d93308852ef
parentd92849fe5a9c8a24203f70b02806737666cb980b (diff)
downloadcoreutils-5908e29e825286121c69f5c10c313ccae6860fa7.tar.xz
split: return success even if a --filter exits
src/split.c (main): Don't unblock SIGPIPE before cleanup, as then any pending signals will be sent and cause the main split process to exit with a non zero status (141). * test/split/filter: Add a test for this case.
-rw-r--r--src/split.c6
-rwxr-xr-xtests/split/filter4
2 files changed, 6 insertions, 4 deletions
diff --git a/src/split.c b/src/split.c
index 6c75080a7..3f925380e 100644
--- a/src/split.c
+++ b/src/split.c
@@ -1230,15 +1230,15 @@ main (int argc, char **argv)
/* When filtering, closure of one pipe must not terminate the process,
as there may still be other streams expecting input from us. */
- sigemptyset (&newblocked);
if (filter_command)
{
struct sigaction act;
+ sigemptyset (&newblocked);
sigaction (SIGPIPE, NULL, &act);
if (act.sa_handler != SIG_IGN)
sigaddset (&newblocked, SIGPIPE);
+ sigprocmask (SIG_BLOCK, &newblocked, &oldblocked);
}
- sigprocmask (SIG_BLOCK, &newblocked, &oldblocked);
switch (split_type)
{
@@ -1276,8 +1276,6 @@ main (int argc, char **argv)
abort ();
}
- sigprocmask (SIG_SETMASK, &oldblocked, NULL);
-
if (close (STDIN_FILENO) != 0)
error (EXIT_FAILURE, errno, "%s", infile);
closeout (NULL, output_desc, filter_pid, outfile);
diff --git a/tests/split/filter b/tests/split/filter
index 4c25c5fcd..0614841ed 100755
--- a/tests/split/filter
+++ b/tests/split/filter
@@ -43,4 +43,8 @@ done
split -e -n 10 --filter='xz > $FILE.xz' /dev/null || fail=1
stat x?? 2>/dev/null && fail=1
+# Ensure SIGPIPEs sent by the children don't propagate back
+# where they would result in a non zero exit from split.
+yes | head -n200K | split -b1G --filter='head -c1 >/dev/null' || fail=1
+
Exit $fail