summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2014-11-10 14:28:43 +0000
committerTulio Magno Quites Machado Filho <tuliom@linux.vnet.ibm.com>2015-03-10 09:17:34 -0300
commitd15dc58e2af6503967d2c5af1b4dee0da58081dc (patch)
treec99196ad39b9332cd498d8edd1e9b9aeceb0393c
parent5f954e9c757740dc20f16fae33a326f174aec0bf (diff)
downloadbinutils-gdb-users/ibm/binutils-2_24.tar.gz
Fix objcopy and strip so that they remove their temporary files even if an error occurs.users/ibm/binutils-2_24
PR binutils/17552 * (copy_archive): Clean up temporary files even if an error occurs.
-rw-r--r--binutils/ChangeLog6
-rw-r--r--binutils/objcopy.c21
2 files changed, 20 insertions, 7 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 53789b5a4a1..7e4cdec8c16 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 495e5c24050..bd46a0a2296 100644
--- a/binutils/objcopy.c
+++ b/binutils/objcopy.c
@@ -2209,8 +2209,12 @@ copy_archive (bfd *ibfd, bfd *obfd, const char *output_target,
/* 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 @@ copy_archive (bfd *ibfd, bfd *obfd, const char *output_target,
{
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 @@ copy_archive (bfd *ibfd, bfd *obfd, const char *output_target,
{
bfd_nonfatal_message (output_name, NULL, NULL, NULL);
status = 1;
- return;
+ goto cleanup_and_exit;
}
if (ok_object)
@@ -2325,7 +2333,6 @@ copy_archive (bfd *ibfd, bfd *obfd, const char *output_target,
{
status = 1;
bfd_nonfatal_message (filename, NULL, NULL, NULL);
- return;
}
filename = bfd_get_filename (ibfd);
@@ -2333,9 +2340,9 @@ copy_archive (bfd *ibfd, bfd *obfd, const char *output_target,
{
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)
{