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.
This commit is contained in:
parent
84f800117f
commit
7b958a48e1
14 changed files with 107 additions and 107 deletions
|
@ -1680,7 +1680,6 @@ NAME(_bfd_elf,bfd_from_remote_memory)
|
|||
bfd_vma high_offset;
|
||||
bfd_vma shdr_end;
|
||||
bfd_vma loadbase; /* Bytes. */
|
||||
char *filename;
|
||||
size_t amt;
|
||||
unsigned int opb = bfd_octets_per_byte (templ, NULL);
|
||||
|
||||
|
@ -1894,22 +1893,14 @@ NAME(_bfd_elf,bfd_from_remote_memory)
|
|||
free (contents);
|
||||
return NULL;
|
||||
}
|
||||
filename = bfd_strdup ("<in-memory>");
|
||||
if (filename == NULL)
|
||||
{
|
||||
free (bim);
|
||||
free (contents);
|
||||
return NULL;
|
||||
}
|
||||
nbfd = _bfd_new_bfd ();
|
||||
if (nbfd == NULL)
|
||||
if (nbfd == NULL
|
||||
|| !bfd_set_filename (nbfd, "<in-memory>"))
|
||||
{
|
||||
free (filename);
|
||||
free (bim);
|
||||
free (contents);
|
||||
return NULL;
|
||||
}
|
||||
nbfd->filename = filename;
|
||||
nbfd->xvec = templ->xvec;
|
||||
bim->size = high_offset;
|
||||
bim->buffer = contents;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue