From dc0a606175241970a65b8f28d2ed182217fbc5e9 Mon Sep 17 00:00:00 2001 From: Francesco Tamagni Date: Mon, 17 Jun 2024 09:51:11 +0200 Subject: [PATCH 1/4] Add iP command to dsc ##io --- libr/io/p/io_dsc.c | 129 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) diff --git a/libr/io/p/io_dsc.c b/libr/io/p/io_dsc.c index 927a069c52984..0e283d3ab669f 100644 --- a/libr/io/p/io_dsc.c +++ b/libr/io/p/io_dsc.c @@ -116,6 +116,7 @@ typedef struct { RIO *io_backref; RIODscSlices slices; ut64 total_size; + ut64 last_seek; } RIODscObject; typedef enum { @@ -254,6 +255,131 @@ static ut64 __lseek_dsc(RIO *io, RIODesc *fd, ut64 offset, int whence) { return r_io_dsc_object_seek (io, (RIODscObject *)fd->data, offset, whence); } +static char *__system(RIO *io, RIODesc *fd, const char *command) { + r_return_val_if_fail (io && fd && fd->data && command, NULL); + RIODscObject *dsc = (RIODscObject*) fd->data; + + if (r_str_startswith (command, "iP")) { + PJ *pj = pj_new (); + if (!pj) { + return NULL; + } + + ut64 size = 8; + if (command[2] == ' ') { + size = r_num_math (NULL, command + 3); + } + + ut64 paddr = dsc->last_seek; + + RList * slices = r_io_dsc_object_get_slices_by_range (dsc, paddr, size); + if (!slices) { + return NULL; + } + + RListIter * iter; + RIODscTrimmedSlice * trimmed; + int total = 0; + int failures = 0; + int index = 0; + int n_slices = r_list_length (slices); + + pj_a (pj); + + r_list_foreach (slices, iter, trimmed) { + RList * infos = r_io_dsc_slice_get_rebase_infos_by_range (trimmed->slice, trimmed->seek, trimmed->count); + if (!infos) { + return NULL; + } + + RListIter * iter; + RIODscTrimmedRebaseInfo * trimmed_info; + + r_list_foreach (infos, iter, trimmed_info) { + ut64 remaining_size = trimmed_info->count; + ut64 cursor = 0; + while (remaining_size > 0) { + ut8 raw_value_buf[8]; + bool got_raw_value; + ut64 off_local = trimmed_info->off_local + cursor; + RIO_FREAD_AT_INTO_DIRECT (trimmed->slice->fd, off_local, &raw_value_buf, 8, got_raw_value); + remaining_size -= 8; + cursor += 8; + if (!got_raw_value) { + R_LOG_ERROR ("Error reading raw pointer"); + break; + } + + ut64 raw_value = r_read_le64 (raw_value_buf); + + char * tmp; + + pj_o (pj); + + tmp = r_str_newf ("0x%"PFMT64x, trimmed->slice->start + off_local); + pj_ks (pj, "paddr", tmp); + free (tmp); + + tmp = r_str_newf ("0x%"PFMT64x, raw_value); + pj_ks (pj, "raw", tmp); + free (tmp); + + tmp = r_str_newf ("v%d", trimmed_info->info->info->version); + pj_ks (pj, "format", tmp); + free (tmp); + + switch (trimmed_info->info->info->version) { + case 1: + case 2: + case 4: + break; + case 3: + if (R_IS_PTR_AUTHENTICATED (raw_value)) { + bool has_diversity = (raw_value & (1ULL << 48)) != 0; + pj_kb (pj, "has_diversity", has_diversity); + if (has_diversity) { + ut64 diversity = (raw_value >> 32) & 0xFFFF; + pj_kn (pj, "diversity", diversity); + } + ut64 key = (raw_value >> 49) & 3; + const char * names[4] = { "ia", "ib", "da", "db" }; + pj_ks (pj, "key", names[key]); + } + break; + case 5: + if (R_IS_PTR_AUTHENTICATED (raw_value)) { + bool has_diversity = (raw_value & (1ULL << 50)) != 0; + pj_kb (pj, "has_diversity", has_diversity); + if (has_diversity) { + ut64 diversity = (raw_value >> 34) & 0xFFFF; + pj_kn (pj, "diversity", diversity); + } + ut64 key = (raw_value >> 51) & 1; + const char * names[2] = { "ia", "da" }; + pj_ks (pj, "key", names[key]); + } + break; + default: + R_LOG_ERROR ("Unsupported rebase info version %d", trimmed_info->info->info->version); + } + pj_end (pj); + } + } + r_list_free (infos); + } + + r_list_free (slices); + + pj_end (pj); + + char * result = strdup (pj_string (pj)); + pj_free (pj); + return result; + } + + return NULL; +} + static RIODscObject *r_io_dsc_object_new(RIO *io, const char *filename, int perm, int mode) { r_return_val_if_fail (io && filename, NULL); @@ -707,6 +833,8 @@ static ut64 r_io_dsc_object_seek(RIO *io, RIODscObject *dsc, ut64 offset, int wh io->off = off_local + slice->start; + dsc->last_seek = io->off; + return io->off; } @@ -1611,6 +1739,7 @@ RIOPlugin r_io_plugin_dsc = { .read = __read, .check = __check, .seek = __lseek_dsc, + .system = __system, #if R2__UNIX__ .is_blockdevice = __is_blockdevice, #endif From 18aab858622df720c401919fdac3404b98eec60e Mon Sep 17 00:00:00 2001 From: Francesco Tamagni Date: Thu, 4 Jul 2024 17:08:18 +0200 Subject: [PATCH 2/4] Fix lint error for too much error in the error --- libr/io/p/io_dsc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libr/io/p/io_dsc.c b/libr/io/p/io_dsc.c index 0e283d3ab669f..0fe73fead957a 100644 --- a/libr/io/p/io_dsc.c +++ b/libr/io/p/io_dsc.c @@ -306,7 +306,7 @@ static char *__system(RIO *io, RIODesc *fd, const char *command) { remaining_size -= 8; cursor += 8; if (!got_raw_value) { - R_LOG_ERROR ("Error reading raw pointer"); + R_LOG_ERROR ("reading raw pointer"); break; } From 5cee3457ee0ab7fd746b3f1c1d4dfb7dd8c15a1b Mon Sep 17 00:00:00 2001 From: Francesco Tamagni Date: Thu, 4 Jul 2024 17:27:23 +0200 Subject: [PATCH 3/4] Remove leftover unused vars --- libr/io/p/io_dsc.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/libr/io/p/io_dsc.c b/libr/io/p/io_dsc.c index 0fe73fead957a..6be23846bfaa1 100644 --- a/libr/io/p/io_dsc.c +++ b/libr/io/p/io_dsc.c @@ -279,10 +279,6 @@ static char *__system(RIO *io, RIODesc *fd, const char *command) { RListIter * iter; RIODscTrimmedSlice * trimmed; - int total = 0; - int failures = 0; - int index = 0; - int n_slices = r_list_length (slices); pj_a (pj); From 9dbb93493bcf127731df7d39c9e418755c65c914 Mon Sep 17 00:00:00 2001 From: Francesco Tamagni Date: Thu, 4 Jul 2024 18:30:04 +0200 Subject: [PATCH 4/4] Fix review issues --- libr/io/p/io_dsc.c | 68 ++++++++++++++++++++++------------------------ 1 file changed, 32 insertions(+), 36 deletions(-) diff --git a/libr/io/p/io_dsc.c b/libr/io/p/io_dsc.c index 6be23846bfaa1..ea3ec3ca3f671 100644 --- a/libr/io/p/io_dsc.c +++ b/libr/io/p/io_dsc.c @@ -308,11 +308,9 @@ static char *__system(RIO *io, RIODesc *fd, const char *command) { ut64 raw_value = r_read_le64 (raw_value_buf); - char * tmp; - pj_o (pj); - tmp = r_str_newf ("0x%"PFMT64x, trimmed->slice->start + off_local); + char * tmp = r_str_newf ("0x%"PFMT64x, trimmed->slice->start + off_local); pj_ks (pj, "paddr", tmp); free (tmp); @@ -325,38 +323,38 @@ static char *__system(RIO *io, RIODesc *fd, const char *command) { free (tmp); switch (trimmed_info->info->info->version) { - case 1: - case 2: - case 4: - break; - case 3: - if (R_IS_PTR_AUTHENTICATED (raw_value)) { - bool has_diversity = (raw_value & (1ULL << 48)) != 0; - pj_kb (pj, "has_diversity", has_diversity); - if (has_diversity) { - ut64 diversity = (raw_value >> 32) & 0xFFFF; - pj_kn (pj, "diversity", diversity); - } - ut64 key = (raw_value >> 49) & 3; - const char * names[4] = { "ia", "ib", "da", "db" }; - pj_ks (pj, "key", names[key]); + case 1: + case 2: + case 4: + break; + case 3: + if (R_IS_PTR_AUTHENTICATED (raw_value)) { + bool has_diversity = (raw_value & (1ULL << 48)) != 0; + pj_kb (pj, "has_diversity", has_diversity); + if (has_diversity) { + ut64 diversity = (raw_value >> 32) & 0xFFFF; + pj_kn (pj, "diversity", diversity); } - break; - case 5: - if (R_IS_PTR_AUTHENTICATED (raw_value)) { - bool has_diversity = (raw_value & (1ULL << 50)) != 0; - pj_kb (pj, "has_diversity", has_diversity); - if (has_diversity) { - ut64 diversity = (raw_value >> 34) & 0xFFFF; - pj_kn (pj, "diversity", diversity); - } - ut64 key = (raw_value >> 51) & 1; - const char * names[2] = { "ia", "da" }; - pj_ks (pj, "key", names[key]); + ut64 key = (raw_value >> 49) & 3; + const char * names[4] = { "ia", "ib", "da", "db" }; + pj_ks (pj, "key", names[key]); + } + break; + case 5: + if (R_IS_PTR_AUTHENTICATED (raw_value)) { + bool has_diversity = (raw_value & (1ULL << 50)) != 0; + pj_kb (pj, "has_diversity", has_diversity); + if (has_diversity) { + ut64 diversity = (raw_value >> 34) & 0xFFFF; + pj_kn (pj, "diversity", diversity); } - break; - default: - R_LOG_ERROR ("Unsupported rebase info version %d", trimmed_info->info->info->version); + ut64 key = (raw_value >> 51) & 1; + const char * names[2] = { "ia", "da" }; + pj_ks (pj, "key", names[key]); + } + break; + default: + R_LOG_ERROR ("Unsupported rebase info version %d", trimmed_info->info->info->version); } pj_end (pj); } @@ -368,9 +366,7 @@ static char *__system(RIO *io, RIODesc *fd, const char *command) { pj_end (pj); - char * result = strdup (pj_string (pj)); - pj_free (pj); - return result; + return pj_drain (pj); } return NULL;