140 lines
4.6 KiB
Diff
140 lines
4.6 KiB
Diff
From d0586065e67b5df2611f4cf61eb791d48b78ff77 Mon Sep 17 00:00:00 2001
|
|
From: lizhengui <lizhengui@huawei.com>
|
|
Date: Wed, 9 Sep 2020 14:42:59 +0800
|
|
Subject: [PATCH] cris: do not leak struct cris_disasm_data
|
|
|
|
Use a stack-allocated struct to avoid a memory leak.
|
|
|
|
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
---
|
|
disas/cris.c | 65 ++++++++++++++++++++++++++++------------------------
|
|
1 file changed, 35 insertions(+), 30 deletions(-)
|
|
|
|
diff --git a/disas/cris.c b/disas/cris.c
|
|
index 2f43c9b2..f3ff44ba 100644
|
|
--- a/disas/cris.c
|
|
+++ b/disas/cris.c
|
|
@@ -1294,24 +1294,17 @@ static int cris_constraint
|
|
/* Parse disassembler options and store state in info. FIXME: For the
|
|
time being, we abuse static variables. */
|
|
|
|
-static bfd_boolean
|
|
-cris_parse_disassembler_options (disassemble_info *info,
|
|
+static void
|
|
+cris_parse_disassembler_options (struct cris_disasm_data *disdata,
|
|
+ char *disassembler_options,
|
|
enum cris_disass_family distype)
|
|
{
|
|
- struct cris_disasm_data *disdata;
|
|
-
|
|
- info->private_data = calloc (1, sizeof (struct cris_disasm_data));
|
|
- disdata = (struct cris_disasm_data *) info->private_data;
|
|
- if (disdata == NULL)
|
|
- return false;
|
|
-
|
|
/* Default true. */
|
|
disdata->trace_case
|
|
- = (info->disassembler_options == NULL
|
|
- || (strcmp (info->disassembler_options, "nocase") != 0));
|
|
+ = (disassembler_options == NULL
|
|
+ || (strcmp (disassembler_options, "nocase") != 0));
|
|
|
|
disdata->distype = distype;
|
|
- return true;
|
|
}
|
|
|
|
static const struct cris_spec_reg *
|
|
@@ -2736,9 +2729,11 @@ static int
|
|
print_insn_cris_with_register_prefix (bfd_vma vma,
|
|
disassemble_info *info)
|
|
{
|
|
- if (info->private_data == NULL
|
|
- && !cris_parse_disassembler_options (info, cris_dis_v0_v10))
|
|
- return -1;
|
|
+ struct cris_disasm_data disdata;
|
|
+ info->private_data = &disdata;
|
|
+ cris_parse_disassembler_options (&disdata, info->disassembler_options,
|
|
+ cris_dis_v0_v10);
|
|
+
|
|
return print_insn_cris_generic (vma, info, true);
|
|
}
|
|
/* Disassemble, prefixing register names with `$'. CRIS v32. */
|
|
@@ -2747,9 +2742,11 @@ static int
|
|
print_insn_crisv32_with_register_prefix (bfd_vma vma,
|
|
disassemble_info *info)
|
|
{
|
|
- if (info->private_data == NULL
|
|
- && !cris_parse_disassembler_options (info, cris_dis_v32))
|
|
- return -1;
|
|
+ struct cris_disasm_data disdata;
|
|
+ info->private_data = &disdata;
|
|
+ cris_parse_disassembler_options (&disdata, info->disassembler_options,
|
|
+ cris_dis_v32);
|
|
+
|
|
return print_insn_cris_generic (vma, info, true);
|
|
}
|
|
|
|
@@ -2761,9 +2758,11 @@ static int
|
|
print_insn_crisv10_v32_with_register_prefix (bfd_vma vma,
|
|
disassemble_info *info)
|
|
{
|
|
- if (info->private_data == NULL
|
|
- && !cris_parse_disassembler_options (info, cris_dis_common_v10_v32))
|
|
- return -1;
|
|
+ struct cris_disasm_data disdata;
|
|
+ info->private_data = &disdata;
|
|
+ cris_parse_disassembler_options (&disdata, info->disassembler_options,
|
|
+ cris_dis_common_v10_v32);
|
|
+
|
|
return print_insn_cris_generic (vma, info, true);
|
|
}
|
|
|
|
@@ -2773,9 +2772,11 @@ static int
|
|
print_insn_cris_without_register_prefix (bfd_vma vma,
|
|
disassemble_info *info)
|
|
{
|
|
- if (info->private_data == NULL
|
|
- && !cris_parse_disassembler_options (info, cris_dis_v0_v10))
|
|
- return -1;
|
|
+ struct cris_disasm_data disdata;
|
|
+ info->private_data = &disdata;
|
|
+ cris_parse_disassembler_options (&disdata, info->disassembler_options,
|
|
+ cris_dis_v0_v10);
|
|
+
|
|
return print_insn_cris_generic (vma, info, false);
|
|
}
|
|
|
|
@@ -2785,9 +2786,11 @@ static int
|
|
print_insn_crisv32_without_register_prefix (bfd_vma vma,
|
|
disassemble_info *info)
|
|
{
|
|
- if (info->private_data == NULL
|
|
- && !cris_parse_disassembler_options (info, cris_dis_v32))
|
|
- return -1;
|
|
+ struct cris_disasm_data disdata;
|
|
+ info->private_data = &disdata;
|
|
+ cris_parse_disassembler_options (&disdata, info->disassembler_options,
|
|
+ cris_dis_v32);
|
|
+
|
|
return print_insn_cris_generic (vma, info, false);
|
|
}
|
|
|
|
@@ -2798,9 +2801,11 @@ static int
|
|
print_insn_crisv10_v32_without_register_prefix (bfd_vma vma,
|
|
disassemble_info *info)
|
|
{
|
|
- if (info->private_data == NULL
|
|
- && !cris_parse_disassembler_options (info, cris_dis_common_v10_v32))
|
|
- return -1;
|
|
+ struct cris_disasm_data disdata;
|
|
+ info->private_data = &disdata;
|
|
+ cris_parse_disassembler_options (&disdata, info->disassembler_options,
|
|
+ cris_dis_common_v10_v32);
|
|
+
|
|
return print_insn_cris_generic (vma, info, false);
|
|
}
|
|
#endif
|
|
--
|
|
2.19.1
|
|
|