diff --git a/librz/core/cmd/cmd.c b/librz/core/cmd/cmd.c index a57d21bfc3..2069dca904 100644 --- a/librz/core/cmd/cmd.c +++ b/librz/core/cmd/cmd.c @@ -908,12 +908,24 @@ RZ_IPI RzCmdStatus rz_push_escaped_handler(RzCore *core, int argc, const char ** return res; } +static RzCmdStatus pointer_read(RzCore *core, const char *expr) { + ut64 n = rz_num_math(core->num, expr); + if (core->num->dbz) { + RZ_LOG_ERROR("core: RzNum ERROR: Division by Zero\n"); + return RZ_CMD_STATUS_ERROR; + } + if (!rz_io_read_i(core->io, n, &n, core->rasm->bits / 8, core->print->big_endian)) { + return RZ_CMD_STATUS_ERROR; + } + rz_cons_printf("0x%" PFMT64x "\n", n); + return RZ_CMD_STATUS_OK; +} + RZ_IPI RzCmdStatus rz_pointer_handler(RzCore *core, int argc, const char **argv) { int ret; switch (argc) { case 2: - ret = rz_core_cmdf(core, "?v [%s]", argv[1]); - return rz_cmd_int2status(ret); + return pointer_read(core, argv[1]); case 3: if (rz_str_startswith(argv[2], "0x")) { ret = rz_core_cmdf(core, "wv %s @ %s", argv[2], argv[1]); diff --git a/librz/core/core.c b/librz/core/core.c index 83b4957a94..d654a44251 100644 --- a/librz/core/core.c +++ b/librz/core/core.c @@ -576,21 +576,10 @@ static ut64 num_callback(RzNum *userptr, const char *str, int *ok) { if (ok) { *ok = 1; } - ut8 buf[sizeof(ut64)] = RZ_EMPTY; - (void)rz_io_read_at(core->io, n, buf, RZ_MIN(sizeof(buf), refsz)); - switch (refsz) { - case 8: - return rz_read_ble64(buf, core->print->big_endian); - case 4: - return rz_read_ble32(buf, core->print->big_endian); - case 2: - return rz_read_ble16(buf, core->print->big_endian); - case 1: - return rz_read_ble8(buf); - default: - RZ_LOG_ERROR("core: invalid reference size: %d (%s)\n", refsz, str); + if (!rz_io_read_i(core->io, n, &n, refsz, core->print->big_endian)) { return 0LL; } + return n; } break; case '$': if (ok) { diff --git a/test/db/cmd/cmd_pointer b/test/db/cmd/cmd_pointer new file mode 100644 index 0000000000..9d24b72d11 --- /dev/null +++ b/test/db/cmd/cmd_pointer @@ -0,0 +1,18 @@ +NAME=pointer read +FILE=malloc://1024 +CMDS=<