From 20135676fc4c3912297c313b3e0d3cbd6cc402e3 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Mon, 9 Dec 2019 20:34:49 +1030 Subject: [PATCH 1/1] 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/objdump.c | 1 + include/dis-asm.h | 5 ++++- opcodes/disassemble.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 79 insertions(+), 1 deletion(-) diff --git a/binutils/objdump.c b/binutils/objdump.c index d48a73a..c10136e 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/dis-asm.h b/include/dis-asm.h index c174650..82bf4dc 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/disassemble.c b/opcodes/disassemble.c index f131ee8..7c91997 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.9.3