From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 47988 invoked by alias); 20 Apr 2016 05:33:01 -0000 Mailing-List: contact cygwin-help@cygwin.com; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner@cygwin.com Mail-Followup-To: cygwin@cygwin.com Received: (qmail 47934 invoked by uid 89); 20 Apr 2016 05:32:54 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.3 required=5.0 tests=AWL,BAYES_00,RP_MATCHES_RCVD,SPF_PASS autolearn=ham version=3.3.2 spammy=Close, H*r:ip*192.168.1.9, U*eggert, sk:eggert X-HELO: zimbra.cs.ucla.edu Received: from zimbra.cs.ucla.edu (HELO zimbra.cs.ucla.edu) (131.179.128.68) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Wed, 20 Apr 2016 05:32:41 +0000 Received: from localhost (localhost [127.0.0.1]) by zimbra.cs.ucla.edu (Postfix) with ESMTP id 62E76160972; Tue, 19 Apr 2016 22:32:40 -0700 (PDT) Received: from zimbra.cs.ucla.edu ([127.0.0.1]) by localhost (zimbra.cs.ucla.edu [127.0.0.1]) (amavisd-new, port 10032) with ESMTP id 81RQagpzBx_4; Tue, 19 Apr 2016 22:32:39 -0700 (PDT) Received: from localhost (localhost [127.0.0.1]) by zimbra.cs.ucla.edu (Postfix) with ESMTP id 602F816125C; Tue, 19 Apr 2016 22:32:39 -0700 (PDT) Received: from zimbra.cs.ucla.edu ([127.0.0.1]) by localhost (zimbra.cs.ucla.edu [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id 1UdKJEw-k59T; Tue, 19 Apr 2016 22:32:39 -0700 (PDT) Received: from [192.168.1.9] (unknown [100.32.155.148]) by zimbra.cs.ucla.edu (Postfix) with ESMTPSA id 3B405160972; Tue, 19 Apr 2016 22:32:39 -0700 (PDT) Subject: Re: bug#23314: gzip-1.7-1 regression: cannot redirect output of gzip -l To: 23314-done@debbugs.gnu.org References: <1461059351776.571881.3e60150cb042ecb2c8733407f23d3f30c0d10aa5@spica.telekom.de> <57163ADD.1080005@redhat.com> <5716D21F.1020505@cs.ucla.edu> Cc: Eric Blake , cygwin@cygwin.com From: Paul Eggert Message-ID: <57171473.7060701@cs.ucla.edu> Date: Wed, 20 Apr 2016 05:57:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 In-Reply-To: <5716D21F.1020505@cs.ucla.edu> Content-Type: multipart/mixed; boundary="------------080008010903080804060601" X-SW-Source: 2016-04/txt/msg00484.txt.bz2 --------------080008010903080804060601 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-length: 215 Come to think of it, that part of gzip can be simplified considerably, which should make future problems like this less likely. I installed the attached additional patch. Yay, 46 fewer files in the gzip tarball! --------------080008010903080804060601 Content-Type: text/x-diff; name="0001-gzip-simplify-by-closing-ourselves.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="0001-gzip-simplify-by-closing-ourselves.patch" Content-length: 5460 >From 02b67e301e66c8641230afbe8663f2d503c0f57b Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Tue, 19 Apr 2016 22:05:57 -0700 Subject: [PATCH] gzip: simplify by closing ourselves This simplifies the previous fix, by avoiding the use of the closein module. That module was problematic, as gzip normally does not use stdio for output and never uses it for input. Also, it is a heavyweight module, as it drags many files into lib (c-ctype.c, c-ctype.h, closein.c, closein.h, closeout.c, closeout.h, close-stream.c, close-stream.h, config.charset, c-strcasecmp.c, c-strcaseeq.h, c-strcase.h, c-strncasecmp.c, fpending.c, fpending.h, freadahead.c, freadahead.h, localcharset.c, localcharset.h, mbrtowc.c, mbsinit.c, quotearg.c, quotearg.h, quote.h, ref-add.sin, ref-del.sin, streq.h, wctype-h.c, wctype.in.h) and into m4 (closein.m4, closeout.m4, close-stream.m4, codeset.m4, configmake.m4, fpending.m4, freadahead.m4, glibc21.m4, localcharset.m4, locale-fr.m4, locale-ja.m4, locale-zh.m4, mbrtowc.m4, mbsinit.m4, mbstate_t.m4, quotearg.m4, wctype_h.m4), and these files are thus no longer needed. * bootstrap.conf (gnulib_modules): Remove closein. * gzip.c: Don't include closein.h. (stdin_was_read): New static var. (main): Don't use close_stdin. Invoke finish_out to exit after outputting via stdio's stdout. Close stdin after reading it. Restore previous way of closing stdout. (treat_stdin): Record that stdin was read. (finish_out): New function. --- bootstrap.conf | 1 - gzip.c | 33 +++++++++++++++++++++++++-------- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/bootstrap.conf b/bootstrap.conf index 25acaac..6cbaaa2 100644 --- a/bootstrap.conf +++ b/bootstrap.conf @@ -24,7 +24,6 @@ gnulib_modules=' announce-gen calloc close -closein dirname-lgpl fclose fcntl diff --git a/gzip.c b/gzip.c index 3b8de4d..4a51b13 100644 --- a/gzip.c +++ b/gzip.c @@ -63,7 +63,6 @@ static char const *const license_msg[] = { #include #include -#include "closein.h" #include "tailor.h" #include "gzip.h" #include "intprops.h" @@ -206,6 +205,8 @@ static int volatile exiting_signal; /* If nonnegative, close this file descriptor and unlink ofname on error. */ static int volatile remove_ofname_fd = -1; +static bool stdin_was_read; + off_t bytes_in; /* number of input bytes */ off_t bytes_out; /* number of output bytes */ static off_t total_in; /* input bytes for all files */ @@ -317,6 +318,7 @@ local void install_signal_handlers (void); local void remove_output_file (void); local RETSIGTYPE abort_gzip_signal (int); local void do_exit (int exitcode) ATTRIBUTE_NORETURN; +static void finish_out (void); int main (int argc, char **argv); static int (*work) (int infile, int outfile) = zip; /* function to call */ @@ -427,8 +429,6 @@ int main (int argc, char **argv) program_name = gzip_base_name (argv[0]); proglen = strlen (program_name); - atexit (close_stdin); - /* Suppress .exe for MSDOS, OS/2 and VMS: */ if (4 < proglen && strequ (program_name + proglen - 4, ".exe")) program_name[proglen - 4] = '\0'; @@ -527,13 +527,13 @@ int main (int argc, char **argv) case 'f': force++; break; case 'h': case 'H': - help(); do_exit(OK); break; + help (); finish_out (); break; case 'k': keep = 1; break; case 'l': list = decompress = to_stdout = 1; break; case 'L': - license(); do_exit(OK); break; + license (); finish_out (); break; case 'm': /* undocumented, may change later */ no_time = 1; break; case 'M': /* undocumented, may change later */ @@ -580,7 +580,7 @@ int main (int argc, char **argv) case 'v' + ENV_OPTION: verbose++; quiet = 0; break; case 'V': - version(); do_exit(OK); break; + version (); finish_out (); break; case 'Z': #ifdef LZW do_lzw = 1; break; @@ -664,6 +664,11 @@ int main (int argc, char **argv) } else { /* Standard input */ treat_stdin(); } + if (stdin_was_read && close (STDIN_FILENO) != 0) + { + strcpy (ifname, "stdin"); + read_error (); + } if (list) { /* Output any totals, and check for output errors. */ @@ -672,8 +677,11 @@ int main (int argc, char **argv) if (fflush (stdout) != 0) write_error (); } - if (to_stdout && synchronous && fdatasync (STDOUT_FILENO) != 0 - && errno != EINVAL && errno != EBADF) + if (to_stdout + && ((synchronous + && fdatasync (STDOUT_FILENO) != 0 && errno != EINVAL) + || close (STDOUT_FILENO) != 0) + && errno != EBADF) write_error (); do_exit(exit_code); return exit_code; /* just to avoid lint warning */ @@ -759,6 +767,7 @@ local void treat_stdin() to_stdout = 1; part_nb = 0; ifd = STDIN_FILENO; + stdin_was_read = true; if (decompress) { method = get_method(ifd); @@ -2093,6 +2102,14 @@ local void do_exit(exitcode) exit(exitcode); } +static void +finish_out (void) +{ + if (fclose (stdout) != 0) + write_error (); + do_exit (OK); +} + /* ======================================================================== * Close and unlink the output file. */ -- 2.5.5 --------------080008010903080804060601 Content-Type: text/plain; charset=us-ascii Content-length: 218 -- Problem reports: http://cygwin.com/problems.html FAQ: http://cygwin.com/faq/ Documentation: http://cygwin.com/docs.html Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple --------------080008010903080804060601--