From a74ac8c41971682f687a8a5ce94f36a8054ecd0e Mon Sep 17 00:00:00 2001 From: Szabolcs Nagy Date: Tue, 17 Oct 2023 14:13:00 +0100 Subject: 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. --- bfd/elfnn-aarch64.c | 56 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 24 deletions(-) (limited to 'bfd') diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c index 798643a..3adece3 100644 --- a/bfd/elfnn-aarch64.c +++ b/bfd/elfnn-aarch64.c @@ -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; -- cgit v1.1