bool test_r_io_mapsplit (void) { RIO *io = r_io_new (); io->va = true; r_io_open_at (io, "null://2", R_PERM_R, 0LL, UT64_MAX); mu_assert ("Found no map at UT64", r_io_map_get (io, UT64_MAX)); mu_assert ("Found no map at 0x0", r_io_map_get (io, 0x0)); r_io_free (io); mu_end; }
bool test_r_io_priority2(void) { RIO *io = r_io_new(); ut32 map0; ut8 buf[2]; bool ret; io->va = true; RIODesc *desc0 = r_io_open_at (io, "malloc://1024", R_PERM_RW, 0644, 0x0); mu_assert_notnull (desc0, "first malloc should be opened"); map0 = r_io_map_get (io, 0)->id; ret = r_io_read_at (io, 0, (ut8 *)&buf, 2); mu_assert ("should be able to read", ret); mu_assert_memeq (buf, (ut8 *)"\x00\x00", 2, "0 should be there initially"); r_io_write_at (io, 0, (const ut8 *)"\x90\x90", 2); r_io_read_at (io, 0, buf, 2); mu_assert_memeq (buf, (ut8 *)"\x90\x90", 2, "0x90 was written"); RIODesc *desc1 = r_io_open_at (io, "malloc://1024", R_PERM_R, 0644, 0x0); mu_assert_notnull (desc1, "second malloc should be opened"); r_io_read_at (io, 0, buf, 2); mu_assert_memeq (buf, (ut8 *)"\x00\x00", 2, "0x00 from map1 should be on top"); r_io_map_priorize (io, map0); r_io_read_at (io, 0, buf, 2); mu_assert_memeq (buf, (ut8 *)"\x90\x90", 2, "0x90 from map0 should be on top after prioritize"); r_io_free (io); mu_end; }
bool test_r_io_priority(void) { RIO *io = r_io_new(); ut32 map0, map1; ut64 buf; bool ret; io->va = true; r_io_open_at (io, "malloc://8", R_PERM_RW, 0644, 0x0); map0 = r_io_map_get (io, 0)->id; ret = r_io_read_at (io, 0, (ut8 *)&buf, 8); mu_assert ("should be able to read", ret); mu_assert_memeq ((ut8 *)&buf, (ut8 *)"\x00\x00\x00\x00\x00\x00\x00\x00", 8, "0 should be there initially"); buf = 0x9090909090909090; r_io_write_at (io, 0, (ut8 *)&buf, 8); mu_assert_memeq ((ut8 *)&buf, (ut8 *)"\x90\x90\x90\x90\x90\x90\x90\x90", 8, "0x90 should have been written"); r_io_open_at (io, "malloc://2", R_PERM_RW, 0644, 0x4); map1 = r_io_map_get (io, 4)->id; r_io_read_at (io, 0, (ut8 *)&buf, 8); mu_assert_memeq ((ut8 *)&buf, (ut8 *)"\x90\x90\x90\x90\x00\x00\x90\x90", 8, "0x00 from map1 should overlap"); buf ^= UT64_MAX; r_io_write_at (io, 0, (ut8 *)&buf, 8); r_io_read_at (io, 0, (ut8 *)&buf, 8); mu_assert_memeq ((ut8 *)&buf, (ut8 *)"\x6f\x6f\x6f\x6f\xff\xff\x6f\x6f", 8, "memory has been xored"); r_io_map_priorize (io, map0); r_io_read_at (io, 0, (ut8 *)&buf, 8); mu_assert_memeq ((ut8 *)&buf, (ut8 *)"\x6f\x6f\x6f\x6f\x90\x90\x6f\x6f", 8, "map0 should have been prioritized"); r_io_map_remap (io, map1, 0x2); r_io_read_at (io, 0, (ut8 *)&buf, 8); mu_assert_memeq ((ut8 *)&buf, (ut8 *)"\x6f\x6f\x6f\x6f\x90\x90\x6f\x6f", 8, "map1 should have been remapped"); r_io_map_priorize (io, map1); r_io_read_at (io, 0, (ut8 *)&buf, 8); mu_assert_memeq ((ut8 *)&buf, (ut8 *)"\x6f\x6f\xff\xff\x90\x90\x6f\x6f", 8, "map1 should have been prioritized"); r_io_free (io); mu_end; }
static bool flagbar_foreach(RFlagItem *fi, void *user) { struct flagbar_t *u = (struct flagbar_t *)user; ut64 min = 0, max = r_io_size (u->core->io); RIOMap *m = r_io_map_get (u->core->io, fi->offset); if (m) { min = m->itv.addr; max = m->itv.addr + m->itv.size; } r_cons_printf ("0x%08"PFMT64x" ", fi->offset); r_print_rangebar (u->core->print, fi->offset, fi->offset + fi->size, min, max, u->cols); r_cons_printf (" %s\n", fi->name); return true; }
R_API int r_io_read_at(RIO *io, ut64 addr, ut8 *buf, int len) { ut64 paddr, last, last2; int ms, ret, l, olen = len, w = 0; io->off = addr; memset (buf, 0xff, len); // probably unnecessary if (io->buffer_enabled) return r_io_buffer_read (io, addr, buf, len); while (len>0) { last = r_io_section_next (io, addr+w); last2 = r_io_map_next (io, addr+w); // XXX: must use physical address if (last == (addr+w)) last = last2; //else if (last2<last) last = last2; l = (len > (last-addr+w))? (last-addr+w): len; if (l<1) l = len; { paddr = w? r_io_section_vaddr_to_offset (io, addr+w): addr; if (len>0 && l>len) l = len; addr = paddr-w; if (r_io_seek (io, paddr, R_IO_SEEK_SET)==UT64_MAX) { memset (buf+w, 0xff, l); } } #if 0 if (io->zeromap) if (!r_io_map_get (io, addr+w)) { if (addr==0||r_io_section_getv (io, addr+w)) { memset (buf+w, 0xff, l); eprintf ("RETRERET\n"); return -1; } } #endif // XXX is this necessary? ms = r_io_map_select (io, addr+w); ret = r_io_read_internal (io, buf+w, l); //eprintf ("READ %d = %02x %02x %02x\n", ret, buf[w], buf[w+1], buf[w+2]); if (ret<1) { memset (buf+w, 0xff, l); // reading out of file ret = 1; } else if (ret<l) { l = ret; } #if USE_CACHE if (io->cached) { r_io_cache_read (io, addr+w, buf+w, len-w); } else if (r_list_length (io->maps) >1) { if (!io->debug && ms>0) { //eprintf ("FAIL MS=%d l=%d d=%d\n", ms, l, d); /* check if address is vaddred in sections */ ut64 o = r_io_section_offset_to_vaddr (io, addr+w); if (o == UT64_MAX) { ut64 o = r_io_section_vaddr_to_offset (io, addr+w); if (o == UT64_MAX) memset (buf+w, 0xff, l); } break; } } #endif w += l; len -= l; } return olen; }