9dc0ea4
commit b7b028a77bd855f6f56b17c8837fc1cca77b469d
9dc0ea4
Author: Andreas Gruenbacher <agruen@gnu.org>
9dc0ea4
Date:   Fri Jun 28 00:30:25 2019 +0200
9dc0ea4
9dc0ea4
    Abort when cleaning up fails
9dc0ea4
    
9dc0ea4
    When a fatal error triggers during cleanup, another attempt will be made to
9dc0ea4
    clean up, which will likely lead to the same fatal error.  So instead, bail out
9dc0ea4
    when that happens.
9dc0ea4
    src/patch.c (cleanup): Bail out when called recursively.
9dc0ea4
    (main): There is no need to call output_files() before cleanup() as cleanup()
9dc0ea4
    already does that.
9dc0ea4
9dc0ea4
diff --git a/src/patch.c b/src/patch.c
9dc0ea4
index 4616a48..02fd982 100644
9dc0ea4
--- a/src/patch.c
9dc0ea4
+++ b/src/patch.c
9dc0ea4
@@ -685,7 +685,6 @@ main (int argc, char **argv)
9dc0ea4
     }
9dc0ea4
     if (outstate.ofp && (ferror (outstate.ofp) || fclose (outstate.ofp) != 0))
9dc0ea4
       write_fatal ();
9dc0ea4
-    output_files (NULL);
9dc0ea4
     cleanup ();
9dc0ea4
     delete_files ();
9dc0ea4
     if (somefailed)
9dc0ea4
@@ -1991,7 +1990,6 @@ void
9dc0ea4
 fatal_exit (int sig)
9dc0ea4
 {
9dc0ea4
   cleanup ();
9dc0ea4
-
9dc0ea4
   if (sig)
9dc0ea4
     exit_with_signal (sig);
9dc0ea4
 
9dc0ea4
@@ -2011,6 +2009,12 @@ remove_if_needed (char const *name, bool *needs_removal)
9dc0ea4
 static void
9dc0ea4
 cleanup (void)
9dc0ea4
 {
9dc0ea4
+  static bool already_cleaning_up;
9dc0ea4
+
9dc0ea4
+  if (already_cleaning_up)
9dc0ea4
+    return;
9dc0ea4
+  already_cleaning_up = true;
9dc0ea4
+
9dc0ea4
   remove_if_needed (TMPINNAME, &TMPINNAME_needs_removal);
9dc0ea4
   remove_if_needed (TMPOUTNAME, &TMPOUTNAME_needs_removal);
9dc0ea4
   remove_if_needed (TMPPATNAME, &TMPPATNAME_needs_removal);