X-Git-Url: https://git.cworth.org/git?p=gzip;a=blobdiff_plain;f=gzip.c;h=2f692b5658327d6e33ee21abcfe0ce53709a9647;hp=61f721e6ed725d3375e88755e3522d607f1f84fe;hb=cf32d8987e502849a4a3ed61baa03c4ef6a9cdb5;hpb=db00b4e39677b0dbf3ea6f7694e0eac7be4ef141 diff --git a/gzip.c b/gzip.c index 61f721e..2f692b5 100644 --- 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); +} +