bfd: aarch64: Fix leaks in case of BTI stub reuse

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.
This commit is contained in:
Szabolcs Nagy
2023-10-17 14:13:00 +01:00
parent d3a8dfdef0
commit a74ac8c419

View 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 =
_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;
}
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->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;
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;