]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
elf64-ppc.c memory leaks
authorAlan Modra <amodra@gmail.com>
Tue, 14 Jan 2025 10:34:27 +0000 (21:04 +1030)
committerAlan Modra <amodra@gmail.com>
Thu, 16 Jan 2025 09:27:19 +0000 (19:57 +1030)
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.

bfd/elf64-ppc.c

index 948e886baad86ff1603d92282eefc1a12f39b789..44861a058521b46754ebaa191034782cb185c757 100644 (file)
@@ -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)