diff options
author | Nick Clifton <nickc@redhat.com> | 2023-09-27 16:09:06 +0100 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2023-09-27 16:09:06 +0100 |
commit | 4befded43f524d0840bb88fff7b77415b73a3851 (patch) | |
tree | 791d87dee82da396ed3d676f84899db03efcba31 /bfd/elfcode.h | |
parent | 58bceb182740111d66fb0afa4b7941a5937dc492 (diff) | |
download | binutils-4befded43f524d0840bb88fff7b77415b73a3851.zip binutils-4befded43f524d0840bb88fff7b77415b73a3851.tar.gz binutils-4befded43f524d0840bb88fff7b77415b73a3851.tar.bz2 |
nm: heap-buffer-overflow at elfcode.h:1507 in bfd_elf64_slurp_symbol_table
PR 30885
* elfcode.h (elf_slurp_symbol_table): Compute the symcount for non dynamic symbols in the same way as _bfd_elf_get_symtab_upper_bound.
Diffstat (limited to 'bfd/elfcode.h')
-rw-r--r-- | bfd/elfcode.h | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/bfd/elfcode.h b/bfd/elfcode.h index 92e727b..ab8c3ea 100644 --- a/bfd/elfcode.h +++ b/bfd/elfcode.h @@ -1255,11 +1255,13 @@ elf_slurp_symbol_table (bfd *abfd, asymbol **symptrs, bool dynamic) symbols. We actually use all the ELF symbols, so there will be no space left over at the end. When we have all the symbols, we build the caller's pointer vector. */ + ebd = get_elf_backend_data (abfd); if (! dynamic) { hdr = &elf_tdata (abfd)->symtab_hdr; verhdr = NULL; + symcount = hdr->sh_size / ebd->s->sizeof_sym; } else { @@ -1278,12 +1280,13 @@ elf_slurp_symbol_table (bfd *abfd, asymbol **symptrs, bool dynamic) if (!_bfd_elf_slurp_version_tables (abfd, false)) return -1; } + + symcount = elf_tdata (abfd)->dt_symtab_count; } - ebd = get_elf_backend_data (abfd); - symcount = elf_tdata (abfd)->dt_symtab_count; if (symcount == 0) symcount = hdr->sh_size / sizeof (Elf_External_Sym); + if (symcount == 0) sym = symbase = NULL; else |