Fix #3761 - Fix drd and add aras command to swap arenas

This commit is contained in:
pancake 2015-11-25 15:20:25 +01:00
parent e0ce78f08c
commit 85ba262c17
4 changed files with 43 additions and 24 deletions

View File

@ -1124,6 +1124,17 @@ static void ar_show_help(RCore *core) {
r_core_cmd_help (core, help_message);
}
static void cmd_ara_help(RCore *core) {
const char* help_msg[] = {
"Usage:", "ara[+-s]", "Register Arena Push/Pop/Swap",
"ara", "", "show all register arenas allocated",
"ara", "+", "push a new register arena for each type",
"ara", "-", "pop last register arena",
"aras", "", "swap last two register arenas",
NULL };
r_core_cmd_help (core, help_msg);
}
// XXX dup from drp :OOO
void cmd_anal_reg(RCore *core, const char *str) {
int size = 0, i, type = R_REG_TYPE_GPR;
@ -1158,6 +1169,12 @@ void cmd_anal_reg(RCore *core, const char *str) {
break;
case 'a': // "ara"
switch (str[1]) {
case '?':
cmd_ara_help (core);
break;
case 's':
r_reg_arena_swap (core->anal->reg, false);
break;
case '+':
r_reg_arena_push (core->anal->reg);
break;

View File

@ -170,7 +170,7 @@ R_API ut64 r_reg_get_pack(RReg *reg, RRegItem *item, int packidx, int packbits);
/* byte arena */
R_API ut8* r_reg_get_bytes(RReg *reg, int type, int *size);
R_API int r_reg_set_bytes(RReg *reg, int type, const ut8* buf, const int len);
R_API bool r_reg_set_bytes(RReg *reg, int type, const ut8* buf, const int len);
R_API RRegArena *r_reg_arena_new (int size);
R_API void r_reg_arena_free(RRegArena* ra);
R_API int r_reg_fit_arena(RReg *reg);

View File

@ -30,7 +30,6 @@ R_API ut8* r_reg_get_bytes(RReg *reg, int type, int *size) {
if (size) *size = sz;
return buf;
}
if (type < 0 || type > (R_REG_TYPE_LAST-1))
return NULL;
sz = reg->regset[type].arena->size;
@ -44,16 +43,16 @@ R_API ut8* r_reg_get_bytes(RReg *reg, int type, int *size) {
}
/* reduce number of return statements */
R_API int r_reg_set_bytes(RReg *reg, int type, const ut8* buf, const int len) {
int i, ret = R_FALSE;
R_API bool r_reg_set_bytes(RReg *reg, int type, const ut8* buf, const int len) {
int i, ret = false;
struct r_reg_set_t *regset;
RRegArena *arena;
int off = 0;
if (len<0 || !buf)
return R_FALSE;
return false;
if (type == -1) {
ret = R_TRUE;
ret = true;
/* deserialize ALL register types in a single buffer */
for (i=0; i<R_REG_TYPE_LAST; i++) {
if (reg->regset[i].arena) {
@ -72,7 +71,7 @@ R_API int r_reg_set_bytes(RReg *reg, int type, const ut8* buf, const int len) {
R_MIN (len-off, arena->size));
off += arena->size;
if (off>len) {
ret = R_FALSE;
ret = false;
break;
}
}
@ -85,7 +84,7 @@ R_API int r_reg_set_bytes(RReg *reg, int type, const ut8* buf, const int len) {
arena->bytes = malloc (len);
if (!arena->bytes) {
arena->size = 0;
return R_FALSE;
return false;
}
arena->size = len;
}
@ -96,7 +95,7 @@ R_API int r_reg_set_bytes(RReg *reg, int type, const ut8* buf, const int len) {
arena->bytes = buf;
} else {
eprintf ("Error resizing arena to %d\n", len);
return R_FALSE;
return false;
}
}
if (arena->bytes) {
@ -104,8 +103,8 @@ R_API int r_reg_set_bytes(RReg *reg, int type, const ut8* buf, const int len) {
//len = R_MIN (len, arena->size);
memset (arena->bytes, 0, arena->size);
memcpy (arena->bytes, buf, len);
ret = R_TRUE;
} else ret = R_FALSE;
ret = true;
} else ret = false;
}
}
return ret;
@ -191,6 +190,7 @@ R_API void r_reg_arena_swap(RReg *reg, int copy) {
void *tmp = ia->data;
ia->data = ib->data;
ib->data = tmp;
reg->regset[i].arena = ia->data;
} else {
//eprintf ("Cannot pop more\n");
break;
@ -203,8 +203,8 @@ R_API void r_reg_arena_swap(RReg *reg, int copy) {
}
R_API int r_reg_arena_set(RReg *reg, int n, int copy) {
// XXX this api should be deprecated
return false;
// XXX this api should be deprecated
return false;
#if 0
int i;
// XXX this shuoldnt be used at all
@ -238,19 +238,15 @@ return false;
}
R_API void r_reg_arena_pop(RReg *reg) {
RRegArena *a;
int i;
for (i=0; i<R_REG_TYPE_LAST; i++) {
if (r_list_length (reg->regset[i].pool) > 1) {
RRegArena *a = r_list_pop (reg->regset[i].pool);
a = reg->regset[i].pool->tail->data;
if (a) {
reg->regset[i].arena = a;
//if (!i) { r_print_hexdump (NULL, 0, a->bytes, a->size, 16, 16); }
}
} else {
eprintf ("Cannot pop more\n");
break;
}
if (r_list_length (reg->regset[i].pool) < 2)
continue;
a = r_list_pop (reg->regset[i].pool);
r_reg_arena_free (a);
a = reg->regset[i].pool->tail->data;
if (a) reg->regset[i].arena = a;
}
}

View File

@ -87,6 +87,8 @@ R_API int r_reg_set_profile_string(RReg *reg, const char *str) {
if (reg->reg_profile_str && !strcmp (reg->reg_profile_str, str))
return true;
// we should reset all the arenas before setting the new reg profile
r_reg_arena_pop (reg);
// Purge the old registers
r_reg_free_internal (reg);
@ -157,6 +159,10 @@ R_API int r_reg_set_profile_string(RReg *reg, const char *str) {
reg->size += 8 - (reg->size&7);
reg->size >>= 3; // bits to bytes (divide by 8)
r_reg_fit_arena (reg);
// dup the last arena to allow regdiffing
r_reg_arena_push (reg);
// reset arenas
return true;
}