* Fix segfault in malloc:// IO backend

* Catch error in core to avoid future issues
This commit is contained in:
pancake 2010-06-13 12:24:07 +02:00
parent f0cca138db
commit ca8a2a9280
2 changed files with 15 additions and 23 deletions

View File

@ -75,12 +75,12 @@ R_API int r_core_seek(RCore *core, ut64 addr, int rb) {
core->offset = old;
eprintf ("Cannot read block at 0x%08"PFMT64x"\n", addr);
} else
if (ret != core->blocksize) {
if (ret <= core->blocksize) {
if (core->ffio) {
memset (core->block, 0xff, core->blocksize);
core->offset = addr;
} else memset (core->block+ret, 0xff, core->blocksize-ret);
}
} else eprintf ("Error: IO backend error\n");
}
return (ret==-1)?R_FALSE:R_TRUE;
}

View File

@ -13,18 +13,16 @@ static unsigned int malloc_bufsz = 0;
// XXX shitty vars -- should be state
static ut64 malloc_seek = 0;
static int __write(struct r_io_t *io, int fd, const ut8 *buf, int count)
{
static int __write(struct r_io_t *io, int fd, const ut8 *buf, int count) {
if (malloc_buf == NULL)
return 0;
return (ssize_t)memcpy(malloc_buf+io->off, buf, count);
memcpy (malloc_buf+io->off, buf, count);
return count;
}
static int __read(struct r_io_t *io, int fd, ut8 *buf, int count)
{
static int __read(struct r_io_t *io, int fd, ut8 *buf, int count) {
if (malloc_buf == NULL)
return 0;
if (malloc_seek + count > malloc_bufsz) {
//config.seek = 0; // ugly hack
//count = config.seek+count-config.size;
@ -32,12 +30,11 @@ static int __read(struct r_io_t *io, int fd, ut8 *buf, int count)
}
if (malloc_seek + count > malloc_bufsz)
malloc_seek = malloc_bufsz;
return (ssize_t)memcpy(buf, malloc_buf+malloc_seek, count);
memcpy (buf, malloc_buf+malloc_seek, count);
return count;
}
static int __close(struct r_io_t *io, int fd)
{
static int __close(struct r_io_t *io, int fd) {
if (malloc_buf == NULL)
return -1;
free(malloc_buf);
@ -46,9 +43,8 @@ static int __close(struct r_io_t *io, int fd)
}
extern ut64 posix_lseek(int fildes, ut64 offset, int whence);
static ut64 __lseek(struct r_io_t *io, int fildes, ut64 offset, int whence)
{
switch(whence) {
static ut64 __lseek(struct r_io_t *io, int fildes, ut64 offset, int whence) {
switch (whence) {
case SEEK_SET:
malloc_seek = offset;
break;
@ -62,13 +58,11 @@ static ut64 __lseek(struct r_io_t *io, int fildes, ut64 offset, int whence)
return malloc_seek;
}
static int __plugin_open(struct r_io_t *io, const char *pathname)
{
static int __plugin_open(struct r_io_t *io, const char *pathname) {
return (!memcmp(pathname, "malloc://", 9));
}
static int __open(struct r_io_t *io, const char *pathname, int flags, int mode)
{
static int __open(struct r_io_t *io, const char *pathname, int flags, int mode) {
char buf[1024];
char *ptr = buf;
@ -91,13 +85,11 @@ static int __open(struct r_io_t *io, const char *pathname, int flags, int mode)
return malloc_fd;
}
static int __init(struct r_io_t *io)
{
static int __init(struct r_io_t *io) {
return R_TRUE;
}
static int __system(struct r_io_t *io, int fd, const char *cmd)
{
static int __system(struct r_io_t *io, int fd, const char *cmd) {
/* */
return 0;
}