Ondřej Vašík bad020
From 3a20f6888575be7059e9acac07d397009e98c213 Mon Sep 17 00:00:00 2001
Ondřej Vašík bad020
From: Ondrej Oprala <ooprala@redhat.com>
Ondřej Vašík bad020
Date: Fri, 22 Feb 2013 12:48:57 +0000
Ondřej Vašík bad020
Subject: install: cleanup properly if the strip program failed for any reason
Ondřej Vašík bad020
Ondřej Vašík bad020
* src/install.c (strip): Indicate failure with a return code instead
Ondřej Vašík bad020
of terminating the program.
Ondřej Vašík bad020
(install_file_in_file): Handle strip's return code and unlink the
Ondřej Vašík bad020
created file if necessary.
Ondřej Vašík bad020
* tests/install/strip-program.sh: Add a test to cover the changes.
Ondřej Vašík bad020
---
Ondřej Vašík bad020
diff --git a/src/install.c b/src/install.c
Ondřej Vašík bad020
index 94374df..a5ed7a8 100644
Ondřej Vašík bad020
--- a/src/install.c
Ondřej Vašík bad020
+++ b/src/install.c
Ondřej Vašík bad020
@@ -515,16 +515,17 @@ change_timestamps (struct stat const *src_sb, char const *dest)
Ondřej Vašík bad020
    magic numbers vary so much from system to system that making
Ondřej Vašík bad020
    it portable would be very difficult.  Not worth the effort. */
Ondřej Vašík bad020
 
Ondřej Vašík bad020
-static void
Ondřej Vašík bad020
+static bool
Ondřej Vašík bad020
 strip (char const *name)
Ondřej Vašík bad020
 {
Ondřej Vašík bad020
   int status;
Ondřej Vašík bad020
+  bool ok = false;
Ondřej Vašík bad020
   pid_t pid = fork ();
Ondřej Vašík bad020
 
Ondřej Vašík bad020
   switch (pid)
Ondřej Vašík bad020
     {
Ondřej Vašík bad020
     case -1:
Ondřej Vašík bad020
-      error (EXIT_FAILURE, errno, _("fork system call failed"));
Ondřej Vašík bad020
+      error (0, errno, _("fork system call failed"));
Ondřej Vašík bad020
       break;
Ondřej Vašík bad020
     case 0:			/* Child. */
Ondřej Vašík bad020
       execlp (strip_program, strip_program, name, NULL);
Ondřej Vašík bad020
@@ -532,11 +533,14 @@ strip (char const *name)
Ondřej Vašík bad020
       break;
Ondřej Vašík bad020
     default:			/* Parent. */
Ondřej Vašík bad020
       if (waitpid (pid, &status, 0) < 0)
Ondřej Vašík bad020
-        error (EXIT_FAILURE, errno, _("waiting for strip"));
Ondřej Vašík bad020
+        error (0, errno, _("waiting for strip"));
Ondřej Vašík bad020
       else if (! WIFEXITED (status) || WEXITSTATUS (status))
Ondřej Vašík bad020
-        error (EXIT_FAILURE, 0, _("strip process terminated abnormally"));
Ondřej Vašík bad020
+        error (0, 0, _("strip process terminated abnormally"));
Ondřej Vašík bad020
+      else
Ondřej Vašík bad020
+        ok = true;      /* strip succeeded */
Ondřej Vašík bad020
       break;
Ondřej Vašík bad020
     }
Ondřej Vašík bad020
+  return ok;
Ondřej Vašík bad020
 }
Ondřej Vašík bad020
 
Ondřej Vašík bad020
 /* Initialize the user and group ownership of the files to install. */
Ondřej Vašík bad020
@@ -681,7 +685,12 @@ install_file_in_file (const char *from, const char *to,
Ondřej Vašík bad020
   if (! copy_file (from, to, x))
Ondřej Vašík bad020
     return false;
Ondřej Vašík bad020
   if (strip_files)
Ondřej Vašík bad020
-    strip (to);
Ondřej Vašík bad020
+    if (! strip (to))
Ondřej Vašík bad020
+      {
Ondřej Vašík bad020
+        if (unlink (to) != 0)  /* Cleanup.  */
Ondřej Vašík bad020
+          error (EXIT_FAILURE, errno, _("cannot unlink %s"), to);
Ondřej Vašík bad020
+        return false;
Ondřej Vašík bad020
+      }
Ondřej Vašík bad020
   if (x->preserve_timestamps && (strip_files || ! S_ISREG (from_sb.st_mode))
Ondřej Vašík bad020
       && ! change_timestamps (&from_sb, to))
Ondřej Vašík bad020
     return false;
Ondřej Vašík bad020
diff --git a/tests/install/strip-program.sh b/tests/install/strip-program.sh
Ondřej Vašík bad020
index 8950d50..5d65373 100755
Ondřej Vašík bad020
--- a/tests/install/strip-program.sh
Ondřej Vašík bad020
+++ b/tests/install/strip-program.sh
Ondřej Vašík bad020
@@ -33,4 +33,8 @@ echo aBc > exp || fail=1
Ondřej Vašík bad020
 ginstall src dest -s --strip-program=./b || fail=1
Ondřej Vašík bad020
 compare exp dest || fail=1
Ondřej Vašík bad020
 
Ondřej Vašík bad020
+# Check that install cleans up properly if strip fails.
Ondřej Vašík bad020
+ginstall src dest2 -s --strip-program=./FOO && fail=1
Ondřej Vašík bad020
+test -e dest2 && fail=1
Ondřej Vašík bad020
+
Ondřej Vašík bad020
 Exit $fail
Ondřej Vašík bad020
--
Ondřej Vašík bad020
cgit v0.9.0.2