From 20135676fc4c3912297c313b3e0d3cbd6cc402e3 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Mon, 9 Dec 2019 20:34:49 +1030 Subject: [PATCH] PR24960, Memory leak from disassembler PR 24960 include/ * dis-asm.h (disassemble_free_target): Declare. opcodes/ * disassemble.c (disassemble_free_target): New function. binutils/ * objdump.c (disassemble_data): Call disassemble_free_target. --- binutils/ChangeLog | 5 ++++ binutils/objdump.c | 1 + include/ChangeLog | 5 ++++ include/dis-asm.h | 5 +++- opcodes/ChangeLog | 5 ++++ opcodes/disassemble.c | 59 +++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 79 insertions(+), 1 deletion(-) diff --git a/binutils/ChangeLog b/binutils/ChangeLog index b1ecef23d43..a1948053520 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,8 @@ +2019-12-10 Alan Modra + + PR 24960 + * objdump.c (disassemble_data): Call disassemble_free_target. + 2019-12-10 Alan Modra * objdump.c (struct objdump_disasm_info): Delete "sec". diff --git a/binutils/objdump.c b/binutils/objdump.c index d48a73ac4a7..c10136edc31 100644 --- a/binutils/objdump.c +++ b/binutils/objdump.c @@ -2730,6 +2730,7 @@ disassemble_data (bfd *abfd) if (aux.dynrelbuf != NULL) free (aux.dynrelbuf); free (sorted_syms); + disassemble_free_target (&disasm_info); } static bfd_boolean diff --git a/include/ChangeLog b/include/ChangeLog index 7c4fcb82e2d..681cbfa837e 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,8 @@ +2019-12-10 Alan Modra + + PR 24960 + * dis-asm.h (disassemble_free_target): Declare. + 2019-12-10 Alan Modra * dis-asm.h (struct disassemble_info): Delete insn_sets. diff --git a/include/dis-asm.h b/include/dis-asm.h index c1746502ca2..82bf4dc942b 100644 --- a/include/dis-asm.h +++ b/include/dis-asm.h @@ -325,7 +325,10 @@ extern disassembler_ftype disassembler (enum bfd_architecture arc, /* Amend the disassemble_info structure as necessary for the target architecture. Should only be called after initialising the info->arch field. */ -extern void disassemble_init_for_target (struct disassemble_info * dinfo); +extern void disassemble_init_for_target (struct disassemble_info *); + +/* Tidy any memory allocated by targets, such as info->private_data. */ +extern void disassemble_free_target (struct disassemble_info *); /* Document any target specific options available from the disassembler. */ extern void disassembler_usage (FILE *); diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index 579bad868b5..4d22d511786 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,8 @@ +2019-12-10 Alan Modra + + PR 24960 + * disassemble.c (disassemble_free_target): New function. + 2019-12-10 Alan Modra * cgen-dis.in (print_insn_@arch@): Replace insn_sets with private_data. diff --git a/opcodes/disassemble.c b/opcodes/disassemble.c index f131ee85209..7c919972ee2 100644 --- a/opcodes/disassemble.c +++ b/opcodes/disassemble.c @@ -716,6 +716,65 @@ disassemble_init_for_target (struct disassemble_info * info) } } +void +disassemble_free_target (struct disassemble_info *info) +{ + if (info == NULL) + return; + + switch (info->arch) + { + default: + return; + +#ifdef ARCH_bpf + case bfd_arch_bpf: +#endif +#ifdef ARCH_m32c + case bfd_arch_m32c: +#endif +#if defined ARCH_bpf || defined ARCH_m32c + if (info->private_data) + { + CGEN_BITSET *mask = info->private_data; + free (mask->bits); + } + break; +#endif + +#ifdef ARCH_arc + case bfd_arch_arc: + break; +#endif +#ifdef ARCH_cris + case bfd_arch_cris: + break; +#endif +#ifdef ARCH_mmix + case bfd_arch_mmix: + break; +#endif +#ifdef ARCH_nfp + case bfd_arch_nfp: + break; +#endif +#ifdef ARCH_powerpc + case bfd_arch_powerpc: + break; +#endif +#ifdef ARCH_riscv + case bfd_arch_riscv: + break; +#endif +#ifdef ARCH_rs6000 + case bfd_arch_rs6000: + break; +#endif + } + + free (info->private_data); +} + /* Remove whitespace and consecutive commas from OPTIONS. */ char * -- 2.30.2