From dec6b4614ee7b5559ab44ad457d4a8c032863a00 Mon Sep 17 00:00:00 2001 From: pancake Date: Thu, 14 Sep 2023 23:33:08 +0200 Subject: [PATCH] Implement r_io_bank_get_byname and the omnb= command ##io --- libr/core/cmd_open.inc.c | 16 ++++++++++++++-- libr/include/r_esil.h | 1 - libr/include/r_io.h | 1 + libr/io/io_bank.c | 24 ++++++++++++++++++++++++ test/db/io/banks | 1 + 5 files changed, 40 insertions(+), 3 deletions(-) diff --git a/libr/core/cmd_open.inc.c b/libr/core/cmd_open.inc.c index 2d243662cc..d93ab2f10e 100644 --- a/libr/core/cmd_open.inc.c +++ b/libr/core/cmd_open.inc.c @@ -77,6 +77,7 @@ static RCoreHelpMessage help_msg_omb = { "Usage: omb[+-adgq]", "[fd]", "Operate on memory banks", "omb", "", "list all memory banks", "omb", " [id]", "switch to use a different bank", + "omb=", "[name]", "same as 'omb id' but using its name", "omb+", " [name]", "create a new bank with given name", "omba", " [id]", "adds a map to the bank", "ombd", " [id]", "delete a map from the bank", @@ -133,7 +134,7 @@ static RCoreHelpMessage help_msg_om = { "om,", " [query]", "list maps using table api", "om=", "", "list all maps in ascii art", "oma"," [fd]", "create a map covering all VA for given fd", - "omb", " ", "list/select memory map banks", + "omb", "[?]", "list/select memory map banks", "omB", " mapid addr", "relocate map with corresponding id", "omB.", " addr", "relocate current map", "omd", " from to @ paddr", "simplified om; takes current seek, fd and perms", @@ -763,6 +764,16 @@ static void cmd_omd(RCore *core, const char* input) { static void cmd_open_banks(RCore *core, int argc, char *argv[]) { if (argc == 1) { switch (argv[0][1]) { + case '=': // "omb=[name]" + { + RIOBank *bank = r_io_bank_get_byname (core->io, argv[0] + 2); + if (bank) { + r_io_bank_use (core->io, bank->id); + } else { + R_LOG_ERROR ("unknown bank name (%s)", argv[0] + 2); + } + } + break; case 'g': // "ombg" { ut32 mapid; @@ -860,7 +871,8 @@ static void cmd_open_banks(RCore *core, int argc, char *argv[]) { break; case 0: // "omb [id]" { - if (!r_io_bank_use (core->io, r_num_get (NULL, argv[1]))) { + int id = r_num_get (NULL, argv[1]); + if (!r_io_bank_use (core->io, id)) { R_LOG_ERROR ("Cannot find bank by id %s", argv[1]); } } diff --git a/libr/include/r_esil.h b/libr/include/r_esil.h index 41168474a7..e9b0630782 100644 --- a/libr/include/r_esil.h +++ b/libr/include/r_esil.h @@ -106,7 +106,6 @@ static inline void fini_access(REsilTraceAccess *access) { if (access->is_reg) { return; } - free (access->mem.data); } diff --git a/libr/include/r_io.h b/libr/include/r_io.h index faa0b260fa..d91ca100a0 100644 --- a/libr/include/r_io.h +++ b/libr/include/r_io.h @@ -398,6 +398,7 @@ R_API void r_io_bank_free(RIOBank *bank); R_API void r_io_bank_init(RIO *io); R_API void r_io_bank_fini(RIO *io); R_API RIOBank *r_io_bank_get(RIO *io, const ut32 bankid); +R_API RIOBank *r_io_bank_get_byname(RIO *io, const char *bankname); R_API bool r_io_bank_use(RIO *io, ut32 bankid); R_API bool r_io_bank_map_add_top(RIO *io, const ut32 bankid, const ut32 mapid); R_API bool r_io_bank_map_add_bottom(RIO *io, const ut32 bankid, const ut32 mapid); diff --git a/libr/io/io_bank.c b/libr/io/io_bank.c index 44540a4177..399a0c296c 100644 --- a/libr/io/io_bank.c +++ b/libr/io/io_bank.c @@ -75,6 +75,30 @@ R_API RIOBank *r_io_bank_get(RIO *io, const ut32 bankid) { return (RIOBank *)r_id_storage_get (io->banks, bankid); } +typedef struct { + RIO *io; + RIOBank *bank; + const char *name; +} Boring; + +static bool find_bank(void *data, void *user, ut32 id) { + RIOBank *bank = (RIOBank *)user; + Boring *boo = (Boring *)data; + if (!strcmp (bank->name, boo->name)) { + boo->bank = bank; + return false; + } + return true; +} + +R_API RIOBank *r_io_bank_get_byname(RIO *io, const char *bankname) { + r_return_val_if_fail (io && io->banks && bankname, NULL); + Boring boo = { .io = io, .name = bankname, .bank = NULL }; + eprintf ("ooME (%s)\n", boo.name); + r_id_storage_foreach (io->banks, &find_bank, &boo); + return boo.bank; +} + R_API ut32 r_io_bank_first(RIO *io) { r_return_val_if_fail (io, UT32_MAX); ut32 bankid = -1; diff --git a/test/db/io/banks b/test/db/io/banks index 120e1c0873..50df73f220 100644 --- a/test/db/io/banks +++ b/test/db/io/banks @@ -18,6 +18,7 @@ EXPECT=<