forked from Imagelibrary/binutils-gdb
asprintf memory leaks
A number of backends want to return bfd_reloc_dangerous messaqes from relocation special_function, and construct the message using asprintf. Such messages are not freed anywhere, leading to small memory leaks inside libbfd. To limit the leaks, I'd implemented a static buffer in the ppc backends that was freed before use in asprintf output. This patch extends that scheme to other backends using a shared static buffer and goes further in freeing the buffer on any bfd_close. The patch also fixes a few other cases where asprintf output was not freed after use. bfd/ * bfd.c (_input_error_msg): Make global and rename to.. (_bfd_error_buf): ..this. (bfd_asprintf): New function. (bfd_errmsg): Use bfd_asprintf. * opncls.c (bfd_close_all_done): Free _buf_error_buf. * elf32-arm.c (find_thumb_glue, find_arm_glue): Use bfd_asprintf. * elf32-nios2.c (nios2_elf32_relocate_section): Likewise. * elf32-ppc.c (ppc_elf_unhandled_reloc): Likewise. * elf64-ppc.c (ppc64_elf_unhandled_reloc): Likewise. * elfnn-riscv.c (riscv_resolve_pcrel_lo_relocs): Likewise. (riscv_elf_relocate_section): Likewise. * libbfd.h: Regenerate. gas/ * read.c (read_end): Free current_name and current_label. (do_s_func): Likewise on error path. strdup label. ld/ * pe-dll.c (make_head, make_tail, make_one), (make_singleton_name_thunk, make_import_fixup_entry), (make_runtime_pseudo_reloc), (pe_create_runtime_relocator_reference: Free oname after use.
This commit is contained in:
@@ -2107,6 +2107,7 @@ make_head (bfd *parent)
|
||||
tmp_seq++;
|
||||
|
||||
abfd = bfd_create (oname, parent);
|
||||
free (oname);
|
||||
bfd_find_target (pe_details->object_target, abfd);
|
||||
bfd_make_writable (abfd);
|
||||
|
||||
@@ -2200,6 +2201,7 @@ make_tail (bfd *parent)
|
||||
tmp_seq++;
|
||||
|
||||
abfd = bfd_create (oname, parent);
|
||||
free (oname);
|
||||
bfd_find_target (pe_details->object_target, abfd);
|
||||
bfd_make_writable (abfd);
|
||||
|
||||
@@ -2392,6 +2394,7 @@ make_one (def_file_export *exp, bfd *parent, bool include_jmp_stub)
|
||||
tmp_seq++;
|
||||
|
||||
abfd = bfd_create (oname, parent);
|
||||
free (oname);
|
||||
bfd_find_target (pe_details->object_target, abfd);
|
||||
bfd_make_writable (abfd);
|
||||
|
||||
@@ -2586,6 +2589,7 @@ make_singleton_name_thunk (const char *import, bfd *parent)
|
||||
tmp_seq++;
|
||||
|
||||
abfd = bfd_create (oname, parent);
|
||||
free (oname);
|
||||
bfd_find_target (pe_details->object_target, abfd);
|
||||
bfd_make_writable (abfd);
|
||||
|
||||
@@ -2666,6 +2670,7 @@ make_import_fixup_entry (const char *name,
|
||||
tmp_seq++;
|
||||
|
||||
abfd = bfd_create (oname, parent);
|
||||
free (oname);
|
||||
bfd_find_target (pe_details->object_target, abfd);
|
||||
bfd_make_writable (abfd);
|
||||
|
||||
@@ -2724,6 +2729,7 @@ make_runtime_pseudo_reloc (const char *name ATTRIBUTE_UNUSED,
|
||||
tmp_seq++;
|
||||
|
||||
abfd = bfd_create (oname, parent);
|
||||
free (oname);
|
||||
bfd_find_target (pe_details->object_target, abfd);
|
||||
bfd_make_writable (abfd);
|
||||
|
||||
@@ -2816,6 +2822,7 @@ pe_create_runtime_relocator_reference (bfd *parent)
|
||||
tmp_seq++;
|
||||
|
||||
abfd = bfd_create (oname, parent);
|
||||
free (oname);
|
||||
bfd_find_target (pe_details->object_target, abfd);
|
||||
bfd_make_writable (abfd);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user