From 340dbf5aabfee4e1e657f8ebf202a2fee1750a63 Mon Sep 17 00:00:00 2001 From: Sergey Poznyakoff Date: Sat, 20 Mar 2010 13:14:31 +0200 Subject: [PATCH] Fix undesired error exit on receiving SIGPIPE. * src/tar.c: Do not ignore SIGPIPE. * tests/sigpipe.at: New testcase. * tests/Makefile.am, tests/testsuite.at: Add sigpipe.at * tests/remfiles01.at: Fix error code expectation. * NEWS: Update. --- NEWS | 10 +++++++++- src/tar.c | 2 -- tests/Makefile.am | 1 + tests/remfiles01.at | 4 +++- tests/sigpipe.at | 39 +++++++++++++++++++++++++++++++++++++++ tests/testsuite.at | 2 ++ 6 files changed, 54 insertions(+), 4 deletions(-) create mode 100644 tests/sigpipe.at diff --git a/NEWS b/NEWS index a9be03c..8b55ece 100644 --- a/NEWS +++ b/NEWS @@ -1,10 +1,18 @@ -GNU tar NEWS - User visible changes. 2010-03-17 +GNU tar NEWS - User visible changes. 2010-03-20 Please send GNU tar bug reports to * Bugfixes. +** Spurious error diagnostics on broken pipe. + +When receiving SIGPIPE, tar would exit with error status and +"write error" diagnostics. In particular, this occurred if +invoked as in the example below: + + tar tf archive.tar | head -n 1 + ** --remove-files Tar --remove-files failed to remove a directory which contained diff --git a/src/tar.c b/src/tar.c index e3fdf7b..b127963 100644 --- a/src/tar.c +++ b/src/tar.c @@ -2570,8 +2570,6 @@ main (int argc, char **argv) obstack_init (&argv_stk); - /* Ensure default behavior for some signals */ - signal (SIGPIPE, SIG_IGN); /* System V fork+wait does not work if SIGCHLD is ignored. */ signal (SIGCHLD, SIG_DFL); diff --git a/tests/Makefile.am b/tests/Makefile.am index 8f16244..31811b0 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -127,6 +127,7 @@ TESTSUITE_AT = \ shortfile.at\ shortupd.at\ shortrec.at\ + sigpipe.at\ sparse01.at\ sparse02.at\ sparse03.at\ diff --git a/tests/remfiles01.at b/tests/remfiles01.at index 73752b4..86b5c03 100644 --- a/tests/remfiles01.at +++ b/tests/remfiles01.at @@ -52,7 +52,9 @@ EC=$? sed -n '/(child)/p' err >&2 rm err find . | sort -exit $EC +# Gzip exit code is propagated to the shell. Usually it is +# 141. We convert all non-zero exits to 2 to make it predictable. +test $EC && exit 2 ], [2], [. diff --git a/tests/sigpipe.at b/tests/sigpipe.at new file mode 100644 index 0000000..9edca77 --- /dev/null +++ b/tests/sigpipe.at @@ -0,0 +1,39 @@ +# Process this file with autom4te to create testsuite. -*- Autotest -*- + +# Test suite for GNU tar. +# Copyright (C) 2010 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +AT_SETUP([sigpipe handling]) +AT_KEYWORDS([sigpipe]) + +# Description: Tar 1.23 ignored sigpipe which lead to spurious "write +# error" diagnostics when piping output to another programs. +# Reported-by: "Dmitry V. Levin" +# References: http://lists.gnu.org/archive/html/bug-tar/2010-03/msg00039.html +# <20100319184141.GC30047@wo.int.altlinux.org> + +AT_CHECK([ +genfile --length 2048 --file first +genfile --length 2048 --file second +genfile --length 2049 --file third + +tar cf archive first second third + +tar tf archive | : +], +[0]) + +AT_CLEANUP diff --git a/tests/testsuite.at b/tests/testsuite.at index 3e75ed8..9205d52 100644 --- a/tests/testsuite.at +++ b/tests/testsuite.at @@ -231,6 +231,8 @@ m4_include([remfiles01.at]) m4_include([remfiles02.at]) m4_include([remfiles03.at]) +m4_include([sigpipe.at]) + m4_include([star/gtarfail.at]) m4_include([star/gtarfail2.at]) -- 2.44.0