Fix objcopy and strip so that they remove their temporary files even if an error occurs.

	PR binutils/17552
	* (copy_archive): Clean up temporary files even if an error
	occurs.
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 53789b5..7e4cdec 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,9 @@
+2014-11-10  Nick Clifton  <nickc@redhat.com>
+
+	PR binutils/17552
+	* (copy_archive): Clean up temporary files even if an error
+	occurs.
+
 2014-11-06  Nick Clifton  <nickc@redhat.com>
 
 	PR binutils/17552, binutils/17533
diff --git a/binutils/objcopy.c b/binutils/objcopy.c
index 495e5c2..bd46a0a 100644
--- a/binutils/objcopy.c
+++ b/binutils/objcopy.c
@@ -2209,8 +2209,12 @@
       /* PR binutils/17533: Do not allow directory traversal
 	 outside of the current directory tree by archive members.  */
       if (! is_valid_archive_path (bfd_get_filename (this_element)))
-	fatal (_("illegal pathname found in archive member: %s"),
-	       bfd_get_filename (this_element));
+	{
+	  non_fatal (_("illegal pathname found in archive member: %s"),
+		     bfd_get_filename (this_element));
+	  status = 1;
+	  goto cleanup_and_exit;
+	}
 
       /* Create an output file for this member.  */
       output_name = concat (dir, "/",
@@ -2221,8 +2225,12 @@
 	{
 	  output_name = make_tempdir (output_name);
 	  if (output_name == NULL)
-	    fatal (_("cannot create tempdir for archive copying (error: %s)"),
-		   strerror (errno));
+	    {
+	      non_fatal (_("cannot create tempdir for archive copying (error: %s)"),
+			 strerror (errno));
+	      status = 1;
+	      goto cleanup_and_exit;
+	    }
 
 	  l = (struct name_list *) xmalloc (sizeof (struct name_list));
 	  l->name = output_name;
@@ -2264,7 +2272,7 @@
 	{
 	  bfd_nonfatal_message (output_name, NULL, NULL, NULL);
 	  status = 1;
-	  return;
+	  goto cleanup_and_exit;
 	}
 
       if (ok_object)
@@ -2325,7 +2333,6 @@
     {
       status = 1;
       bfd_nonfatal_message (filename, NULL, NULL, NULL);
-      return;
     }
 
   filename = bfd_get_filename (ibfd);
@@ -2333,9 +2340,9 @@
     {
       status = 1;
       bfd_nonfatal_message (filename, NULL, NULL, NULL);
-      return;
     }
 
+ cleanup_and_exit:
   /* Delete all the files that we opened.  */
   for (l = list; l != NULL; l = l->next)
     {