diff options
Diffstat (limited to 'ld')
-rw-r--r-- | ld/ChangeLog | 9 | ||||
-rw-r--r-- | ld/emultempl/pe.em | 37 | ||||
-rw-r--r-- | ld/emultempl/pep.em | 37 |
3 files changed, 31 insertions, 52 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog index cf566b3..b4ee76c 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,12 @@ +2020-05-20 Alan Modra <amodra@gmail.com> + + PR 25993 + * emultempl/pe.em (gld_${EMULATION_NAME}_after_open): Don't copy + other_bfd_filename for bfd_set_filename, and test result of + bfd_set_filename call. Don't create a new is->filename, simply + copy from bfd filename. Free new_name after bfd_set_filename. + * emultempl/pep.em (gld_${EMULATION_NAME}_after_open): Likewise. + 2020-05-19 Siddhesh Poyarekar <siddesh.poyarekar@arm.com> * testsuite/ld-aarch64/aarch64-elf.exp: New test diff --git a/ld/emultempl/pe.em b/ld/emultempl/pe.em index fe65d2b..8c5ee76 100644 --- a/ld/emultempl/pe.em +++ b/ld/emultempl/pe.em @@ -1523,7 +1523,6 @@ gld_${EMULATION_NAME}_after_open (void) struct bfd_symbol *s; struct bfd_link_hash_entry * blhe; const char *other_bfd_filename; - char *n; s = (relocs[i]->sym_ptr_ptr)[0]; @@ -1550,9 +1549,9 @@ gld_${EMULATION_NAME}_after_open (void) continue; /* Rename this implib to match the other one. */ - n = xmalloc (strlen (other_bfd_filename) + 1); - strcpy (n, other_bfd_filename); - bfd_set_filename (is->the_bfd->my_archive, n); + if (!bfd_set_filename (is->the_bfd->my_archive, + other_bfd_filename)) + einfo ("%F%P: %pB: %E\n", is->the_bfd); } free (relocs); @@ -1655,28 +1654,14 @@ gld_${EMULATION_NAME}_after_open (void) else /* sentinel */ seq = 'c'; - /* PR 25993: It is possible that is->the_bfd-filename == is->filename. - In which case calling bfd_set_filename on one will free the memory - pointed to by the other. */ - if (is->filename == bfd_get_filename (is->the_bfd)) - { - new_name = xmalloc (strlen (is->filename) + 3); - sprintf (new_name, "%s.%c", is->filename, seq); - bfd_set_filename (is->the_bfd, new_name); - is->filename = new_name; - } - else - { - new_name - = xmalloc (strlen (bfd_get_filename (is->the_bfd)) + 3); - sprintf (new_name, "%s.%c", - bfd_get_filename (is->the_bfd), seq); - bfd_set_filename (is->the_bfd, new_name); - - new_name = xmalloc (strlen (is->filename) + 3); - sprintf (new_name, "%s.%c", is->filename, seq); - is->filename = new_name; - } + new_name + = xmalloc (strlen (bfd_get_filename (is->the_bfd)) + 3); + sprintf (new_name, "%s.%c", + bfd_get_filename (is->the_bfd), seq); + is->filename = bfd_set_filename (is->the_bfd, new_name); + free (new_name); + if (!is->filename) + einfo ("%F%P: %pB: %E\n", is->the_bfd); } } } diff --git a/ld/emultempl/pep.em b/ld/emultempl/pep.em index 699b865..ea8e768 100644 --- a/ld/emultempl/pep.em +++ b/ld/emultempl/pep.em @@ -1491,7 +1491,6 @@ gld_${EMULATION_NAME}_after_open (void) struct bfd_symbol *s; struct bfd_link_hash_entry * blhe; const char *other_bfd_filename; - char *n; s = (relocs[i]->sym_ptr_ptr)[0]; @@ -1518,9 +1517,9 @@ gld_${EMULATION_NAME}_after_open (void) continue; /* Rename this implib to match the other one. */ - n = xmalloc (strlen (other_bfd_filename) + 1); - strcpy (n, other_bfd_filename); - bfd_set_filename (is->the_bfd->my_archive, n); + if (!bfd_set_filename (is->the_bfd->my_archive, + other_bfd_filename)) + einfo ("%F%P: %pB: %E\n", is->the_bfd); } free (relocs); @@ -1623,28 +1622,14 @@ gld_${EMULATION_NAME}_after_open (void) else /* sentinel */ seq = 'c'; - /* PR 25993: It is possible that is->the_bfd-filename == is->filename. - In which case calling bfd_set_filename on one will free the memory - pointed to by the other. */ - if (is->filename == bfd_get_filename (is->the_bfd)) - { - new_name = xmalloc (strlen (is->filename) + 3); - sprintf (new_name, "%s.%c", is->filename, seq); - bfd_set_filename (is->the_bfd, new_name); - is->filename = new_name; - } - else - { - new_name - = xmalloc (strlen (bfd_get_filename (is->the_bfd)) + 3); - sprintf (new_name, "%s.%c", - bfd_get_filename (is->the_bfd), seq); - bfd_set_filename (is->the_bfd, new_name); - - new_name = xmalloc (strlen (is->filename) + 3); - sprintf (new_name, "%s.%c", is->filename, seq); - is->filename = new_name; - } + new_name + = xmalloc (strlen (bfd_get_filename (is->the_bfd)) + 3); + sprintf (new_name, "%s.%c", + bfd_get_filename (is->the_bfd), seq); + is->filename = bfd_set_filename (is->the_bfd, new_name); + free (new_name); + if (!is->filename) + einfo ("%F%P: %pB: %E\n", is->the_bfd); } } } |