qemu with hax to log dma reads & writes jcs.org/2018/11/12/vfio

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>

+29 -30
+29 -30
disas/cris.c
··· 1294 1294 /* Parse disassembler options and store state in info. FIXME: For the 1295 1295 time being, we abuse static variables. */ 1296 1296 1297 - static bfd_boolean 1298 - cris_parse_disassembler_options (disassemble_info *info, 1297 + static void 1298 + cris_parse_disassembler_options (struct cris_disasm_data *disdata, 1299 + char *disassembler_options, 1299 1300 enum cris_disass_family distype) 1300 1301 { 1301 - struct cris_disasm_data *disdata; 1302 - 1303 - info->private_data = calloc (1, sizeof (struct cris_disasm_data)); 1304 - disdata = (struct cris_disasm_data *) info->private_data; 1305 - if (disdata == NULL) 1306 - return false; 1307 - 1308 1302 /* Default true. */ 1309 1303 disdata->trace_case 1310 - = (info->disassembler_options == NULL 1311 - || (strcmp (info->disassembler_options, "nocase") != 0)); 1304 + = (disassembler_options == NULL 1305 + || (strcmp (disassembler_options, "nocase") != 0)); 1312 1306 1313 1307 disdata->distype = distype; 1314 - return true; 1315 1308 } 1316 1309 1317 1310 static const struct cris_spec_reg * ··· 2736 2729 print_insn_cris_with_register_prefix (bfd_vma vma, 2737 2730 disassemble_info *info) 2738 2731 { 2739 - if (info->private_data == NULL 2740 - && !cris_parse_disassembler_options (info, cris_dis_v0_v10)) 2741 - return -1; 2732 + struct cris_disasm_data disdata; 2733 + info->private_data = &disdata; 2734 + cris_parse_disassembler_options (&disdata, info->disassembler_options, 2735 + cris_dis_v0_v10); 2742 2736 return print_insn_cris_generic (vma, info, true); 2743 2737 } 2744 2738 /* Disassemble, prefixing register names with `$'. CRIS v32. */ ··· 2747 2741 print_insn_crisv32_with_register_prefix (bfd_vma vma, 2748 2742 disassemble_info *info) 2749 2743 { 2750 - if (info->private_data == NULL 2751 - && !cris_parse_disassembler_options (info, cris_dis_v32)) 2752 - return -1; 2744 + struct cris_disasm_data disdata; 2745 + info->private_data = &disdata; 2746 + cris_parse_disassembler_options (&disdata, info->disassembler_options, 2747 + cris_dis_v32); 2753 2748 return print_insn_cris_generic (vma, info, true); 2754 2749 } 2755 2750 ··· 2761 2756 print_insn_crisv10_v32_with_register_prefix (bfd_vma vma, 2762 2757 disassemble_info *info) 2763 2758 { 2764 - if (info->private_data == NULL 2765 - && !cris_parse_disassembler_options (info, cris_dis_common_v10_v32)) 2766 - return -1; 2759 + struct cris_disasm_data disdata; 2760 + info->private_data = &disdata; 2761 + cris_parse_disassembler_options (&disdata, info->disassembler_options, 2762 + cris_dis_common_v10_v32); 2767 2763 return print_insn_cris_generic (vma, info, true); 2768 2764 } 2769 2765 ··· 2773 2769 print_insn_cris_without_register_prefix (bfd_vma vma, 2774 2770 disassemble_info *info) 2775 2771 { 2776 - if (info->private_data == NULL 2777 - && !cris_parse_disassembler_options (info, cris_dis_v0_v10)) 2778 - return -1; 2772 + struct cris_disasm_data disdata; 2773 + info->private_data = &disdata; 2774 + cris_parse_disassembler_options (&disdata, info->disassembler_options, 2775 + cris_dis_v0_v10); 2779 2776 return print_insn_cris_generic (vma, info, false); 2780 2777 } 2781 2778 ··· 2785 2782 print_insn_crisv32_without_register_prefix (bfd_vma vma, 2786 2783 disassemble_info *info) 2787 2784 { 2788 - if (info->private_data == NULL 2789 - && !cris_parse_disassembler_options (info, cris_dis_v32)) 2790 - return -1; 2785 + struct cris_disasm_data disdata; 2786 + info->private_data = &disdata; 2787 + cris_parse_disassembler_options (&disdata, info->disassembler_options, 2788 + cris_dis_v32); 2791 2789 return print_insn_cris_generic (vma, info, false); 2792 2790 } 2793 2791 ··· 2798 2796 print_insn_crisv10_v32_without_register_prefix (bfd_vma vma, 2799 2797 disassemble_info *info) 2800 2798 { 2801 - if (info->private_data == NULL 2802 - && !cris_parse_disassembler_options (info, cris_dis_common_v10_v32)) 2803 - return -1; 2799 + struct cris_disasm_data disdata; 2800 + info->private_data = &disdata; 2801 + cris_parse_disassembler_options (&disdata, info->disassembler_options, 2802 + cris_dis_common_v10_v32); 2804 2803 return print_insn_cris_generic (vma, info, false); 2805 2804 } 2806 2805 #endif