From: Nathan Sidwell Date: Fri, 18 May 2007 06:36:14 +0000 (+0000) Subject: * objcopy.c (strip_main): Detect identical input and output file X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=12f498a721b3acede21798bd2090cb189308ac2b;p=binutils-gdb.git * objcopy.c (strip_main): Detect identical input and output file names. (copy_main): Refactor tempname detection and use. --- diff --git a/binutils/ChangeLog b/binutils/ChangeLog index f364cca0199..6a7d9456eb4 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,9 @@ +2007-05-18 Nathan Sidwell + + * objcopy.c (strip_main): Detect identical input and output file + names. + (copy_main): Refactor tempname detection and use. + 2007-05-17 Nick Clifton * objdump.c (load_debug_section): Select bias for DWARF debug diff --git a/binutils/objcopy.c b/binutils/objcopy.c index a841e014d40..4d690337561 100644 --- a/binutils/objcopy.c +++ b/binutils/objcopy.c @@ -2769,10 +2769,10 @@ strip_main (int argc, char *argv[]) It has already been checked in get_file_size(). */ stat (argv[i], &statbuf); - if (output_file != NULL) - tmpname = output_file; - else + if (output_file == NULL || strcmp (argv[i], output_file) == 0) tmpname = make_tempname (argv[i]); + else + tmpname = output_file; if (tmpname == NULL) { @@ -2788,13 +2788,14 @@ strip_main (int argc, char *argv[]) { if (preserve_dates) set_times (tmpname, &statbuf); - if (output_file == NULL) - smart_rename (tmpname, argv[i], preserve_dates); + if (output_file != tmpname) + smart_rename (tmpname, output_file ? output_file : argv[i], + preserve_dates); status = hold_status; } else unlink_if_ordinary (tmpname); - if (output_file == NULL) + if (output_file != tmpname) free (tmpname); } @@ -2807,6 +2808,7 @@ copy_main (int argc, char *argv[]) char * binary_architecture = NULL; char *input_filename = NULL; char *output_filename = NULL; + char *tmpname; char *input_target = NULL; char *output_target = NULL; bfd_boolean show_version = FALSE; @@ -3397,32 +3399,24 @@ copy_main (int argc, char *argv[]) /* If there is no destination file, or the source and destination files are the same, then create a temp and rename the result into the input. */ if (output_filename == NULL || strcmp (input_filename, output_filename) == 0) - { - char *tmpname = make_tempname (input_filename); - - if (tmpname == NULL) - fatal (_("warning: could not create temporary file whilst copying '%s', (error: %s)"), - input_filename, strerror (errno)); - - copy_file (input_filename, tmpname, input_target, output_target); - if (status == 0) - { - if (preserve_dates) - set_times (tmpname, &statbuf); - smart_rename (tmpname, input_filename, preserve_dates); - } - else - unlink (tmpname); - } + tmpname = make_tempname (input_filename); else - { - copy_file (input_filename, output_filename, input_target, output_target); + tmpname = output_filename; + + if (tmpname == NULL) + fatal (_("warning: could not create temporary file whilst copying '%s', (error: %s)"), + input_filename, strerror (errno)); - if (status == 0 && preserve_dates) - set_times (output_filename, &statbuf); - else if (status != 0) - unlink_if_ordinary (output_filename); + copy_file (input_filename, tmpname, input_target, output_target); + if (status == 0) + { + if (preserve_dates) + set_times (tmpname, &statbuf); + if (tmpname != output_filename) + smart_rename (tmpname, input_filename, preserve_dates); } + else + unlink_if_ordinary (tmpname); if (change_warn) {