From 7b958a48e1322880f23cdb0a1c35643dd27d3ddb Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Tue, 19 May 2020 12:58:59 +0930 Subject: 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. --- bfd/mach-o.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) (limited to 'bfd/mach-o.c') diff --git a/bfd/mach-o.c b/bfd/mach-o.c index 33bd81e..43fa56c 100644 --- a/bfd/mach-o.c +++ b/bfd/mach-o.c @@ -5573,26 +5573,23 @@ bfd_mach_o_fat_member_init (bfd *abfd, struct areltdata *areltdata; /* Create the member filename. Use ARCH_NAME. */ const bfd_arch_info_type *ap = bfd_lookup_arch (arch_type, arch_subtype); - char *filename; + const char *filename; if (ap) { /* Use the architecture name if known. */ - filename = bfd_strdup (ap->printable_name); - if (filename == NULL) - return FALSE; + filename = bfd_set_filename (abfd, ap->printable_name); } else { /* Forge a uniq id. */ - const size_t namelen = 2 + 8 + 1 + 2 + 8 + 1; - filename = bfd_malloc (namelen); - if (filename == NULL) - return FALSE; - snprintf (filename, namelen, "0x%lx-0x%lx", + char buf[2 + 8 + 1 + 2 + 8 + 1]; + snprintf (buf, sizeof (buf), "0x%lx-0x%lx", entry->cputype, entry->cpusubtype); + filename = bfd_set_filename (abfd, buf); } - bfd_set_filename (abfd, filename); + if (!filename) + return FALSE; areltdata = bfd_zmalloc (sizeof (struct areltdata)); if (areltdata == NULL) -- cgit v1.1