]> git.cworth.org Git - gzip/blobdiff - gzip.c
Imported Debian patch 1.3.5-10sarge1
[gzip] / gzip.c
diff --git a/gzip.c b/gzip.c
index 61f721e6ed725d3375e88755e3522d607f1f84fe..2f692b5658327d6e33ee21abcfe0ce53709a9647 100644 (file)
--- a/gzip.c
+++ b/gzip.c
@@ -467,16 +467,16 @@ int main (argc, argv)
 
     foreground = signal(SIGINT, SIG_IGN) != SIG_IGN;
     if (foreground) {
-       (void) signal (SIGINT, (sig_type)abort_gzip);
+       (void) signal (SIGINT, (sig_type)abort_gzip_signal);
     }
 #ifdef SIGTERM
     if (signal(SIGTERM, SIG_IGN) != SIG_IGN) {
-       (void) signal(SIGTERM, (sig_type)abort_gzip);
+       (void) signal(SIGTERM, (sig_type)abort_gzip_signal);
     }
 #endif
 #ifdef SIGHUP
     if (signal(SIGHUP, SIG_IGN) != SIG_IGN) {
-       (void) signal(SIGHUP,  (sig_type)abort_gzip);
+       (void) signal(SIGHUP,  (sig_type)abort_gzip_signal);
     }
 #endif
 
@@ -586,7 +586,7 @@ int main (argc, argv)
 #ifdef SIGPIPE
     /* Ignore "Broken Pipe" message with --quiet */
     if (quiet && signal (SIGPIPE, SIG_IGN) != SIG_IGN)
-      signal (SIGPIPE, (sig_type) abort_gzip);
+      signal (SIGPIPE, (sig_type) abort_gzip_signal);
 #endif
 
     /* By default, save name and timestamp on compression but do not
@@ -1850,13 +1850,31 @@ local void do_exit(exitcode)
 }
 
 /* ========================================================================
- * Signal and error handler.
+ * Close and unlink the output file if appropriate.  This routine must be
+ * async-signal-safe.
  */
-RETSIGTYPE abort_gzip()
-{
+local void do_remove() {
    if (remove_ofname) {
        close(ofd);
        xunlink (ofname);
    }
-   do_exit(ERROR);
 }
+
+/* ========================================================================
+ * Error handler.
+ */
+RETSIGTYPE abort_gzip()
+{
+       do_remove();
+       do_exit(ERROR);
+}
+
+/* ========================================================================
+ * Signal handler.
+ */
+RETSIGTYPE abort_gzip_signal()
+{
+       do_remove();
+       _exit(ERROR);
+}
+