From 3557cd57906915eb9c990b5f386e25c395592643 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Tue, 19 Apr 2016 17:43:09 -0700 Subject: [PATCH] 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. --- NEWS | 3 +++ gzip.c | 18 ++++++++++-------- tests/Makefile.am | 1 + tests/list | 31 +++++++++++++++++++++++++++++++ 4 files changed, 45 insertions(+), 8 deletions(-) create mode 100755 tests/list diff --git a/NEWS b/NEWS index fdae647..8f722e5 100644 --- a/NEWS +++ b/NEWS @@ -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] diff --git a/gzip.c b/gzip.c index d66530a..3b8de4d 100644 --- a/gzip.c +++ b/gzip.c @@ -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 . +# 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 -- 2.30.2