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
|