diff options
author | Alan Modra <amodra@gmail.com> | 2023-06-21 14:33:59 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2023-06-21 15:49:39 +0930 |
commit | 08edd976116312550831cdfd3b5a4b069bdcca80 (patch) | |
tree | 282512b430114071c32d454caa20a15a43b1aefc /bfd/elf32-arm.c | |
parent | 9a925d0dad55a3cd4e493642b81c668d2ab09d1d (diff) | |
download | gdb-08edd976116312550831cdfd3b5a4b069bdcca80.zip gdb-08edd976116312550831cdfd3b5a4b069bdcca80.tar.gz gdb-08edd976116312550831cdfd3b5a4b069bdcca80.tar.bz2 |
elf32_arm_get_synthetic_symtab memory leak
ARM get_synthetic_symtab reads .plt and caches that data. Caching the
data doesn't make a lot of sense since get_synthetic_symtab is only
called once per bfd, and the memory might be put to better use. It
also leaks on closing the bfd.
* elf32-arm.c (elf32_arm_get_synthetic_symtab): Don't cache
plt contents. Free plt data before returning.
Diffstat (limited to 'bfd/elf32-arm.c')
-rw-r--r-- | bfd/elf32-arm.c | 25 |
1 files changed, 10 insertions, 15 deletions
diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c index 2afe67a..3b7cee3 100644 --- a/bfd/elf32-arm.c +++ b/bfd/elf32-arm.c @@ -20073,15 +20073,9 @@ elf32_arm_get_synthetic_symtab (bfd *abfd, if (!elf32_arm_size_info.slurp_reloc_table (abfd, relplt, dynsyms, true)) return -1; - data = plt->contents; - if (data == NULL) - { - if (!bfd_get_full_section_contents (abfd, plt, &data) - || data == NULL) - return -1; - plt->contents = data; - plt->flags |= SEC_IN_MEMORY; - } + data = NULL; + if (!bfd_get_full_section_contents (abfd, plt, &data)) + return -1; count = NUM_SHDR_ENTRIES (hdr); size = count * sizeof (asymbol); @@ -20093,13 +20087,13 @@ elf32_arm_get_synthetic_symtab (bfd *abfd, size += sizeof ("+0x") - 1 + 8; } - s = *ret = (asymbol *) bfd_malloc (size); - if (s == NULL) - return -1; - offset = elf32_arm_plt0_size (abfd, data); - if (offset == (bfd_vma) -1) - return -1; + if (offset == (bfd_vma) -1 + || (s = *ret = (asymbol *) bfd_malloc (size)) == NULL) + { + free (data); + return -1; + } names = (char *) (s + count); p = relplt->relocation; @@ -20144,6 +20138,7 @@ elf32_arm_get_synthetic_symtab (bfd *abfd, offset += plt_size; } + free (data); return n; } |