Skip to content

Commit d03e7f3

Browse files
committed
Minor optimization in r_io_bank_overlay_foreach ##io
1 parent 9f085e0 commit d03e7f3

File tree

2 files changed

+24
-9
lines changed

2 files changed

+24
-9
lines changed

libr/core/cmd_open.inc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -939,7 +939,7 @@ static void cmd_open_banks(RCore *core, int argc, char *argv[]) {
939939
}
940940
}
941941

942-
static void overlay_print_diff_cb (RInterval itv, const ut8 *m_data, const ut8 *o_data, void *user) {
942+
static void overlay_print_diff_cb(RInterval itv, const ut8 *m_data, const ut8 *o_data, void *user) {
943943
// RCore *core = user;
944944
char *m_hex = r_hex_bin2strdup (m_data, r_itv_size (itv));
945945
char *o_hex = r_hex_bin2strdup (o_data, r_itv_size (itv));

libr/io/io_bank.c

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -939,27 +939,42 @@ static void bof_cb (RInterval itv, const ut8 *data, void *user) {
939939
return;
940940
}
941941
RInterval ov_itv = r_itv_intersect (itv, bof->sm->itv);
942-
ut8 *m_data = R_NEWS (ut8, r_itv_size (ov_itv));
943-
if (!m_data) {
944-
return;
942+
union {
943+
ut8 data[sizeof (ut8 *)];
944+
ut8 *ptr;
945+
} m;
946+
if (R_UNLIKELY (r_itv_size (ov_itv) > sizeof (ut8 *))) {
947+
m.ptr = R_NEWS (ut8, r_itv_size (ov_itv));
948+
if (!m.ptr) {
949+
return;
950+
}
945951
}
946952
const ut8 *o_data = &data[
947953
(r_itv_begin (itv) < r_itv_begin (ov_itv))?
948954
(r_itv_begin (ov_itv) - r_itv_begin (itv)): 0];
949955
const ut64 pa = r_itv_begin (ov_itv) - r_io_map_from (bof->map) + bof->map->delta;
950-
if (r_io_fd_read_at (bof->io, bof->map->fd, pa, m_data, r_itv_size (ov_itv)) != r_itv_size (ov_itv)) {
956+
if (R_UNLIKELY (r_itv_size (ov_itv) > sizeof (ut8 *))) {
957+
if (r_io_fd_read_at (bof->io, bof->map->fd, pa, m.ptr,
958+
r_itv_size (ov_itv)) != r_itv_size (ov_itv)) {
959+
R_LOG_WARN ("r_io_fd_read_at failed");
960+
free (m.ptr);
961+
return;
962+
}
963+
bof->cb (ov_itv, m.ptr, o_data, bof->user);
964+
free (m.ptr);
965+
return;
966+
}
967+
if (r_io_fd_read_at (bof->io, bof->map->fd, pa, m.data, r_itv_size (ov_itv)) != r_itv_size (ov_itv)) {
951968
R_LOG_WARN ("r_io_fd_read_at failed");
952-
free (m_data);
953969
return;
954970
}
955-
bof->cb (ov_itv, m_data, o_data, bof->user);
956-
free (m_data);
971+
bof->cb (ov_itv, m.data, o_data, bof->user);
957972
}
958973

959974
R_API void r_io_bank_overlay_foreach(RIO *io, const ut32 bankid, RIOOverlayForeach cb, void *user) {
960975
R_RETURN_IF_FAIL (io && cb);
961976
RIOBank *bank = r_io_bank_get (io, bankid);
962-
if (!bank || !bank->submaps || !bank->submaps->size) {
977+
if (!io->overlay || !bank || !bank->submaps || !bank->submaps->size) {
963978
return;
964979
}
965980
RRBNode *node = r_crbtree_first_node (bank->submaps);

0 commit comments

Comments
 (0)