PR25993, read of freed memory
authorAlan Modra <amodra@gmail.com>
Tue, 19 May 2020 03:28:59 +0000 (12:58 +0930)
committerAlan Modra <amodra@gmail.com>
Wed, 20 May 2020 02:13:50 +0000 (11:43 +0930)
commit7b958a48e1322880f23cdb0a1c35643dd27d3ddb
treef22ca3f8b85ab4a5d371c465a899700a4989209f
parent84f800117f075b78932d3abdc0a09421bb9d2657
PR25993, read of freed memory

ldmain.c:add_archive_element copies file name pointers from the bfd to
a lang_input_statement_type.
  input->filename = abfd->filename;
  input->local_sym_name = abfd->filename;
This results in stale pointers when twiddling the bfd filename in
places like the pe ld after_open.  So don't free the bfd filename,
and make copies using bfd_alloc memory that won't result in small
memory leaks that annoy memory checkers.

PR 25993
bfd/
* archive.c (_bfd_get_elt_at_filepos): Don't strdup filename,
use bfd_set_filename.
* elfcode.h (_bfd_elf_bfd_from_remote_memory): Likewise.
* mach-o.c (bfd_mach_o_fat_member_init): Likewise.
* opncls.c (bfd_fopen, bfd_openstreamr, bfd_openr_iovec, bfd_openw),
(bfd_create): Likewise.
(_bfd_delete_bfd): Don't free filename.
(bfd_set_filename): Copy filename param to bfd_alloc'd memory,
return pointer to the copy or NULL on alloc fail.
* vms-lib.c (_bfd_vms_lib_get_module): Free newname and test
result of bfd_set_filename.
* bfd-in2.h: Regenerate.
gdb/
* solib-darwin.c (darwin_bfd_open): Don't strdup pathname for
bfd_set_filename.
* solib-aix.c (solib_aix_bfd_open): Use std::string for name
passed to bfd_set_filename.
* symfile-mem.c (add_vsyscall_page): Likewise for string
passed to symbol_file_add_from_memory.
(symbol_file_add_from_memory): Make name param a const char* and
don't strdup.
ld/
* emultempl/pe.em (gld_${EMULATION_NAME}_after_open): Don't copy
other_bfd_filename for bfd_set_filename, and test result of
bfd_set_filename call.  Don't create a new is->filename, simply
copy from bfd filename.  Free new_name after bfd_set_filename.
* emultempl/pep.em (gld_${EMULATION_NAME}_after_open): Likewise.
14 files changed:
bfd/ChangeLog
bfd/archive.c
bfd/bfd-in2.h
bfd/elfcode.h
bfd/mach-o.c
bfd/opncls.c
bfd/vms-lib.c
gdb/ChangeLog
gdb/solib-aix.c
gdb/solib-darwin.c
gdb/symfile-mem.c
ld/ChangeLog
ld/emultempl/pe.em
ld/emultempl/pep.em