From: Alan Modra Date: Tue, 14 Jan 2025 10:34:27 +0000 (+1030) Subject: elf64-ppc.c memory leaks X-Git-Tag: binutils-2_44~93 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=aefcec161e4ecf396ffc5bff385dba761bd1d8ad;p=thirdparty%2Fbinutils-gdb.git elf64-ppc.c memory leaks I've freed htab->relr in two places, first when we're done with it in ppc64_elf_build_stubs, and also when freeing the hasn table to catch cases where the linker exits early due to errors. * elf64-ppc.c (ppc64_elf_link_hash_table_free): Free htab->relr. (ppc64_elf_build_stubs): Also free it here. (ppc_add_stub): Copy stub_name when creating.. (ppc64_elf_size_stubs): ..and always free stub_name. (opd_entry_value): Free sym. (ppc_build_one_stub): bfd_alloc stub sym name. (build_global_entry_stubs_and_plt): Likewise. (ppc64_elf_setup_section_lists): bfd_zalloc htab->sec_info. --- diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index 948e886baad..44861a05852 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -3526,6 +3526,7 @@ ppc64_elf_link_hash_table_free (bfd *obfd) struct ppc_link_hash_table *htab; htab = (struct ppc_link_hash_table *) obfd->link.hash; + free (htab->relr); if (htab->tocsave_htab) htab_delete (htab->tocsave_htab); bfd_hash_table_free (&htab->branch_hash_table); @@ -3894,7 +3895,7 @@ ppc_add_stub (const char *stub_name, /* Enter this entry into the linker stub hash table. */ stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table, stub_name, - true, false); + true, true); if (stub_entry == NULL) { /* xgettext:c-format */ @@ -5689,10 +5690,15 @@ opd_entry_value (asection *opd_sec, break; } sec = bfd_section_from_elf_index (opd_bfd, sym->st_shndx); + if (sec != NULL) + { + BFD_ASSERT ((sec->flags & SEC_MERGE) == 0); + val = sym->st_value; + } + if (symndx >= symtab_hdr->sh_info) + free (sym); if (sec == NULL) break; - BFD_ASSERT ((sec->flags & SEC_MERGE) == 0); - val = sym->st_value; } val += look->r_addend; @@ -12229,7 +12235,7 @@ ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg) len1 = strlen (stub_str[stub_entry->type.main - 1]); len2 = strlen (stub_entry->root.string); - name = bfd_malloc (len1 + len2 + 2); + name = bfd_alloc (info->output_bfd, len1 + len2 + 2); if (name == NULL) return false; memcpy (name, stub_entry->root.string, 9); @@ -12684,7 +12690,7 @@ ppc64_elf_setup_section_lists (struct bfd_link_info *info) htab->sec_info_arr_size = _bfd_section_id; amt = sizeof (*htab->sec_info) * (htab->sec_info_arr_size); - htab->sec_info = bfd_zmalloc (amt); + htab->sec_info = bfd_zalloc (info->output_bfd, amt); if (htab->sec_info == NULL) return -1; @@ -14174,9 +14180,9 @@ ppc64_elf_size_stubs (struct bfd_link_info *info) } stub_entry = ppc_add_stub (stub_name, section, info); + free (stub_name); if (stub_entry == NULL) { - free (stub_name); error_ret_free_internal: if (elf_section_data (section)->relocs == NULL) free (internal_relocs); @@ -14743,7 +14749,8 @@ build_global_entry_stubs_and_plt (struct elf_link_hash_entry *h, void *inf) if (htab->params->emit_stub_syms) { size_t len = strlen (h->root.root.string); - char *name = bfd_malloc (sizeof "12345678.global_entry." + len); + char *name = bfd_alloc (info->output_bfd, + sizeof "12345678.global_entry." + len); if (name == NULL) return false; @@ -15334,6 +15341,8 @@ ppc64_elf_build_stubs (struct bfd_link_info *info, loc += 8; } } + free (htab->relr); + htab->relr = NULL; for (group = htab->group; group != NULL; group = group->next) if ((stub_sec = group->stub_sec) != NULL)