[PATCH 5/8] BFD: Prevent a crash on freeing a BFD's uninitialized section hash
Maciej W. Rozycki
macro@orcam.me.uk
Fri Sep 26 23:53:32 GMT 2025
From: Maciej W. Rozycki <macro@redhat.com>
Ensure memory has been allocated for the section hash before freeing it
in `bfd_preserve_restore' and `bfd_preserve_finish'. It is not required
in principle to only use these internal interfaces on BFDs whose section
hash has been initialized and in particular building archive symbol maps
on the fly would otherwise cause a crash in the latter function where a
BFD is passed whose data has been freed by `_bfd_free_cached_info'.
---
bfd/format.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
binutils-bfd-preserve-restore-hash-table-free.diff
Index: binutils-gdb/bfd/format.c
===================================================================
--- binutils-gdb.orig/bfd/format.c
+++ binutils-gdb/bfd/format.c
@@ -215,7 +215,8 @@ bfd_reinit (bfd *abfd, unsigned int sect
static bfd_cleanup
bfd_preserve_restore (bfd *abfd, struct bfd_preserve *preserve)
{
- bfd_hash_table_free (&abfd->section_htab);
+ if (abfd->section_htab.memory)
+ bfd_hash_table_free (&abfd->section_htab);
abfd->tdata.any = preserve->tdata;
abfd->arch_info = preserve->arch_info;
@@ -256,7 +257,8 @@ bfd_preserve_finish (bfd *abfd ATTRIBUTE
tdata, but that's not possible since these blocks are sitting
inside bfd_alloc'd memory. The section hash is on a separate
objalloc. */
- bfd_hash_table_free (&preserve->section_htab);
+ if (preserve->section_htab.memory)
+ bfd_hash_table_free (&preserve->section_htab);
preserve->marker = NULL;
}
More information about the Binutils
mailing list