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:
Alan Modra
2023-06-14 14:24:50 +09:30
parent 48375c36dc
commit 6f860418d5
10 changed files with 108 additions and 76 deletions

View File

@@ -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);