121 lines
3.0 KiB
Diff
121 lines
3.0 KiB
Diff
From 20135676fc4c3912297c313b3e0d3cbd6cc402e3 Mon Sep 17 00:00:00 2001
|
||
From: Alan Modra <amodra@gmail.com>
|
||
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
|