Bläddra i källkod

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.
Sergey Poznyakoff 15 år sedan
förälder
incheckning
340dbf5aab
6 ändrade filer med 54 tillägg och 4 borttagningar
  1. 9 1
      NEWS
  2. 0 2
      src/tar.c
  3. 1 0
      tests/Makefile.am
  4. 3 1
      tests/remfiles01.at
  5. 39 0
      tests/sigpipe.at
  6. 2 0
      tests/testsuite.at

+ 9 - 1
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 <[email protected]>
 
 
 
 * 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

+ 0 - 2
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);
 

+ 1 - 0
tests/Makefile.am

@@ -127,6 +127,7 @@ TESTSUITE_AT = \
  shortfile.at\
  shortupd.at\
  shortrec.at\
+ sigpipe.at\
  sparse01.at\
  sparse02.at\
  sparse03.at\

+ 3 - 1
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],
 [.

+ 39 - 0
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 <http://www.gnu.org/licenses/>.
+
+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" <[email protected]>
+# References: http://lists.gnu.org/archive/html/bug-tar/2010-03/msg00039.html
+#             <[email protected]>
+
+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

+ 2 - 0
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])