From a21f4bc7e7bc2a721e3afc4a2cbeeab0effeb564 Mon Sep 17 00:00:00 2001 From: Peiwei Hu Date: Mon, 18 Sep 2023 12:04:13 +0800 Subject: [PATCH] Remove the use of rz_core_cmd_strf() in cprint.c (#3869) --- librz/core/cprint.c | 39 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/librz/core/cprint.c b/librz/core/cprint.c index 1894eb0391..ec9d1149ea 100644 --- a/librz/core/cprint.c +++ b/librz/core/cprint.c @@ -539,6 +539,32 @@ static void core_handle_call(RzCore *core, char *line, char **str) { } } +/** + * \brief Get the console output of disassembling \p byte_len bytes at \p addr + */ +static char *cons_dis_n_bytes(RzCore *core, ut64 addr, ut32 byte_len) { + ut8 *block = malloc(byte_len + 1); + if (!block) { + RZ_LOG_ERROR("Cannot allocate buffer\n"); + return NULL; + } + + rz_io_read_at(core->io, addr, block, byte_len); + RzCoreDisasmOptions disasm_options = { + .cbytes = true, + }; + + rz_cons_push(); + rz_core_print_disasm(core, addr, block, byte_len, 9999, NULL, &disasm_options); + rz_cons_filter(); + const char *cons_str = rz_str_get(rz_cons_get_buffer()); + char *ret = strdup(cons_str); + rz_cons_pop(); + rz_cons_echo(NULL); + free(block); + return ret; +} + /** * \brief Get string in disassembly line for \p mode * \param mode RzCorePrintDisasmStringsMode RZ_CORE_DISASM_STRINGS_MODE_{BYTES,INST,BLOCK,FUNCTION} @@ -590,7 +616,10 @@ RZ_API RZ_OWN char *rz_core_print_disasm_strings(RZ_NONNULL RzCore *core, RzCore case RZ_CORE_DISASM_STRINGS_MODE_BLOCK: { RzAnalysisBlock *bb = rz_analysis_find_most_relevant_block_in(core->analysis, core->offset); if (bb) { - dump_string = rz_core_cmd_strf(core, "pD %" PFMT64u " @ 0x%08" PFMT64x, bb->size, bb->addr); + dump_string = cons_dis_n_bytes(core, bb->addr, bb->size); + if (!dump_string) { + goto restore_conf; + } } else { RZ_LOG_ERROR("cannot find block %" PFMT64x ".\n", core->offset); goto restore_conf; @@ -612,10 +641,14 @@ RZ_API RZ_OWN char *rz_core_print_disasm_strings(RZ_NONNULL RzCore *core, RzCore break; } case RZ_CORE_DISASM_STRINGS_MODE_BYTES: - default: - dump_string = rz_core_cmd_strf(core, "pD %" PFMT64d, n_bytes); + default: { + dump_string = cons_dis_n_bytes(core, core->offset, n_bytes); + if (!dump_string) { + goto restore_conf; + } break; } + } rz_config_hold_restore(hc); lines = rz_str_split_duplist(dump_string, "\n", true);