Fix #1726 - ESIL brainfuck is back (and fix io.maps test case) - Thanks @trndr

This commit is contained in:
pancake 2014-11-23 22:44:38 +01:00
parent f0e5c584ba
commit bcf7d46e36
3 changed files with 11 additions and 8 deletions

View File

@ -303,6 +303,7 @@ R_API int r_io_use_desc(RIO *io, RIODesc *fd);
R_API const ut8* r_io_get_raw (RIO *io, ut64 addr, int *len);
R_API RBuffer *r_io_read_buf(RIO *io, ut64 addr, int len);
R_API int r_io_vread (RIO *io, ut64 vaddr, ut8 *buf, int len);
R_API int r_io_read_internal(RIO *io, ut8 *buf, int len);
R_API int r_io_mread (RIO *io, int fd, ut64 maddr, ut8 *buf, int len);
R_API int r_io_pread (RIO *io, ut64 paddr, ut8 *buf, int len);
R_API int r_io_read(RIO *io, ut8 *buf, int len);

View File

@ -105,14 +105,21 @@ R_API int r_io_cache_write(RIO *io, ut64 addr, const ut8 *buf, int len) {
RIOCache *ch;
if (io->cached == 2) // magic hackaround
return 0;
ch = R_NEW (RIOCache);
ch = R_NEW0 (RIOCache);
ch->from = addr;
ch->to = addr + len;
ch->size = len;
ch->odata = (ut8*)malloc (len);
ch->data = (ut8*)malloc (len);
r_io_read_at (io, addr, ch->odata, len);
ch->written = io->cached? 0: 1;
#if 1
// we must use raw io here to avoid calling to cacheread and get wrong reads
if (r_io_seek (io, addr, R_IO_SEEK_SET)==UT64_MAX)
memset (ch->odata, 0xff, len);
r_io_read_internal (io, ch->odata, len);
#else
r_io_read_at (io, addr, ch->odata, len);
#endif
memcpy (ch->data, buf, len);
r_list_append (io->cache, ch);
return len;

View File

@ -286,8 +286,7 @@ R_API RIODesc *r_io_use_fd (RIO *io, int fd) {
return desc;
}
#if !USE_P_API
static inline int r_io_read_internal(RIO *io, ut8 *buf, int len) {
R_API int r_io_read_internal(RIO *io, ut8 *buf, int len) {
int bytes_read = 0;
const char *read_from = NULL;
if (io->desc && io->desc->plugin && io->desc->plugin->read){
@ -309,7 +308,6 @@ static inline int r_io_read_internal(RIO *io, ut8 *buf, int len) {
}
return bytes_read;
}
#endif
R_API int r_io_read(RIO *io, ut8 *buf, int len) {
int ret;
@ -605,9 +603,6 @@ R_API int r_io_write(RIO *io, const ut8 *buf, int len) {
buf += ret;
}
}
if (1) { //io->history) {
r_io_cache_write (io, io->off, buf, len);
}
/* TODO: implement IO cache here. to avoid dupping work on vm for example */