]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
bfd: aarch64: Fix leaks in case of BTI stub reuse
authorSzabolcs Nagy <szabolcs.nagy@arm.com>
Tue, 17 Oct 2023 13:13:00 +0000 (14:13 +0100)
committerSzabolcs Nagy <szabolcs.nagy@arm.com>
Wed, 20 Dec 2023 15:16:33 +0000 (15:16 +0000)
BTI stub parameters were recomputed even if those were already set up.
This is unnecessary work and leaks the symbol name that is allocated
for the stub.

(cherry picked from commit a74ac8c41971682f687a8a5ce94f36a8054ecd0e)

bfd/elfnn-aarch64.c

index 798643ade7c5e11bcc7628acfad3ce060e8a8bdc..3adece302507f4d57adb375d4b0ccc1ef559d864 100644 (file)
@@ -4665,33 +4665,41 @@ _bfd_aarch64_add_call_stub_entries (bool *stub_changed, bfd *output_bfd,
                  stub_entry_bti =
                    aarch64_stub_hash_lookup (&htab->stub_hash_table,
                                              stub_name_bti, false, false);
-                 if (stub_entry_bti == NULL)
-                   stub_entry_bti =
-                     _bfd_aarch64_add_stub_entry_in_group (stub_name_bti,
-                                                           sym_sec, htab);
-                 if (stub_entry_bti == NULL)
+                 if (stub_entry_bti != NULL)
+                   BFD_ASSERT (stub_entry_bti->stub_type
+                               == aarch64_stub_bti_direct_branch);
+                 else
                    {
-                     free (stub_name);
-                     free (stub_name_bti);
-                     goto error_ret_free_internal;
-                   }
-
-                 stub_entry_bti->target_value = sym_value + irela->r_addend;
-                 stub_entry_bti->target_section = sym_sec;
-                 stub_entry_bti->stub_type = aarch64_stub_bti_direct_branch;
-                 stub_entry_bti->h = hash;
-                 stub_entry_bti->st_type = st_type;
+                     stub_entry_bti =
+                       _bfd_aarch64_add_stub_entry_in_group (stub_name_bti,
+                                                             sym_sec, htab);
+                     if (stub_entry_bti == NULL)
+                       {
+                         free (stub_name);
+                         free (stub_name_bti);
+                         goto error_ret_free_internal;
+                       }
 
-                 len = sizeof (BTI_STUB_ENTRY_NAME) + strlen (sym_name);
-                 stub_entry_bti->output_name = bfd_alloc (htab->stub_bfd, len);
-                 if (stub_entry_bti->output_name == NULL)
-                   {
-                     free (stub_name);
-                     free (stub_name_bti);
-                     goto error_ret_free_internal;
+                     stub_entry_bti->target_value =
+                       sym_value + irela->r_addend;
+                     stub_entry_bti->target_section = sym_sec;
+                     stub_entry_bti->stub_type =
+                       aarch64_stub_bti_direct_branch;
+                     stub_entry_bti->h = hash;
+                     stub_entry_bti->st_type = st_type;
+
+                     len = sizeof (BTI_STUB_ENTRY_NAME) + strlen (sym_name);
+                     stub_entry_bti->output_name = bfd_alloc (htab->stub_bfd,
+                                                              len);
+                     if (stub_entry_bti->output_name == NULL)
+                       {
+                         free (stub_name);
+                         free (stub_name_bti);
+                         goto error_ret_free_internal;
+                       }
+                     snprintf (stub_entry_bti->output_name, len,
+                               BTI_STUB_ENTRY_NAME, sym_name);
                    }
-                 snprintf (stub_entry_bti->output_name, len,
-                           BTI_STUB_ENTRY_NAME, sym_name);
 
                  /* Update the indirect call stub to target the BTI stub.  */
                  stub_entry->target_value = 0;