diff --git a/bfd/ChangeLog b/bfd/ChangeLog index e5095904c5..85b883ca7a 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -4,6 +4,8 @@ case, include addend when indexing .opd section map. (ppc64_elf_edit_opd): Add no_opd_opt param. Do nothing besides clear opd_adjust array if no_opd_opt set. Tidy code. + Ignore zero size .opd. Check bfd_alloc return value. + (ppc_stub_name): Return immediately on bfd_malloc fail. * elf64-ppc.h (ppc64_elf_edit_opd): Update prototype. 2005-06-04 H.J. Lu diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index 5c398b1a9f..bd122cf587 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -3581,26 +3581,26 @@ ppc_stub_name (const asection *input_section, { len = 8 + 1 + strlen (h->elf.root.root.string) + 1 + 8 + 1; stub_name = bfd_malloc (len); - if (stub_name != NULL) - { - sprintf (stub_name, "%08x.%s+%x", - input_section->id & 0xffffffff, - h->elf.root.root.string, - (int) rel->r_addend & 0xffffffff); - } + if (stub_name == NULL) + return stub_name; + + sprintf (stub_name, "%08x.%s+%x", + input_section->id & 0xffffffff, + h->elf.root.root.string, + (int) rel->r_addend & 0xffffffff); } else { len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1; stub_name = bfd_malloc (len); - if (stub_name != NULL) - { - sprintf (stub_name, "%08x.%x:%x+%x", - input_section->id & 0xffffffff, - sym_sec->id & 0xffffffff, - (int) ELF64_R_SYM (rel->r_info) & 0xffffffff, - (int) rel->r_addend & 0xffffffff); - } + if (stub_name == NULL) + return stub_name; + + sprintf (stub_name, "%08x.%x:%x+%x", + input_section->id & 0xffffffff, + sym_sec->id & 0xffffffff, + (int) ELF64_R_SYM (rel->r_info) & 0xffffffff, + (int) rel->r_addend & 0xffffffff); } if (stub_name[len - 2] == '+' && stub_name[len - 1] == '0') stub_name[len - 2] = 0; @@ -6176,7 +6176,7 @@ ppc64_elf_edit_opd (bfd *obfd, struct bfd_link_info *info, bfd_size_type cnt_16b = 0; sec = bfd_get_section_by_name (ibfd, ".opd"); - if (sec == NULL) + if (sec == NULL || sec->size == 0) continue; amt = sec->size * sizeof (long) / 8; @@ -6186,6 +6186,8 @@ ppc64_elf_edit_opd (bfd *obfd, struct bfd_link_info *info, /* check_relocs hasn't been called. Must be a ld -r link or --just-symbols object. */ opd_adjust = bfd_alloc (obfd, amt); + if (opd_adjust == NULL) + return FALSE; ppc64_elf_section_data (sec)->opd.adjust = opd_adjust; } memset (opd_adjust, 0, amt);