diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2016-04-19 17:43:09 -0700 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2016-04-19 17:43:55 -0700 |
commit | 3557cd57906915eb9c990b5f386e25c395592643 (patch) | |
tree | 79199522a5d0fe2584f6a928d59835cb2dc9f681 | |
parent | a420fbafe812f9584f4e71cf3bd42f222bae74c8 (diff) | |
download | gzip-3557cd57906915eb9c990b5f386e25c395592643.tar.gz |
gzip: fix bug with -l output to pipes
Problem reported by Christian Franke via Eric Blake in:
http://bugs.gnu.org/23314
* NEWS: Mention this.
* gzip.c (main): Do not close stdout twice when given -l.
Instead, -l now just fflushes stdout, so that fdatasync
can synchronize it if --synchronize is also specified.
* tests/list: New test case.
* tests/Makefile.am (TESTS): Add it.
-rw-r--r-- | NEWS | 3 | ||||
-rw-r--r-- | gzip.c | 18 | ||||
-rw-r--r-- | tests/Makefile.am | 1 | ||||
-rwxr-xr-x | tests/list | 31 |
4 files changed, 45 insertions, 8 deletions
@@ -4,6 +4,9 @@ GNU gzip NEWS -*- outline -*- ** Bug fixes + gzip -l no longer falsely reports a write error when writing to a pipe. + [bug introduced in gzip-1.7] + Port to Oracle Solaris Studio 12 on x86-64. [bug present since at least gzip-1.2.4] @@ -664,14 +664,16 @@ int main (int argc, char **argv) } else { /* Standard input */ treat_stdin(); } - if (list && !quiet && file_count > 1) { - do_list(-1, -1); /* print totals */ - } - if (to_stdout - && ((synchronous - && (fdatasync (STDOUT_FILENO) != 0 && errno != EINVAL)) - || close (STDOUT_FILENO) != 0) - && errno != EBADF) + if (list) + { + /* Output any totals, and check for output errors. */ + if (!quiet && 1 < file_count) + do_list (-1, -1); + if (fflush (stdout) != 0) + write_error (); + } + if (to_stdout && synchronous && fdatasync (STDOUT_FILENO) != 0 + && errno != EINVAL && errno != EBADF) write_error (); do_exit(exit_code); return exit_code; /* just to avoid lint warning */ diff --git a/tests/Makefile.am b/tests/Makefile.am index 5022464..71cf4ad 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -20,6 +20,7 @@ TESTS = \ help-version \ hufts \ keep \ + list \ memcpy-abuse \ mixed \ null-suffix-clobber \ diff --git a/tests/list b/tests/list new file mode 100755 index 0000000..7576dc3 --- /dev/null +++ b/tests/list @@ -0,0 +1,31 @@ +#!/bin/sh +# Exercise the --list option. + +# Copyright 2016 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 of the License, 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/>. +# limit so don't run it by default. + +. "${srcdir=.}/init.sh"; path_prepend_ .. + +echo zoology zucchini > in || framework_failure_ +cp in orig || framework_failure_ + +gzip -l in && fail=1 +gzip -9 in || fail=1 +gzip -l in.gz >out1 || fail=1 +gzip -l in.gz | cat >out2 || fail=1 +compare out1 out2 || fail=1 + +Exit $fail |