mirror of
https://github.com/radareorg/radare2.git
synced 2025-02-22 07:13:43 +00:00
Anal infer fixes
Signed-off-by: Riccardo Schirone <sirmy15@gmail.com>
This commit is contained in:
parent
eef32d0260
commit
9e6d4f2709
@ -80,10 +80,7 @@ R_API int r_anal_bb(RAnal *anal, RAnalBlock *bb, ut64 addr, ut8 *buf, ut64 len,
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (oplen < 1) {
|
||||
r_anal_op_free (op);
|
||||
return R_ANAL_RET_END;
|
||||
}
|
||||
if (oplen < 1) goto beach;
|
||||
|
||||
r_anal_bb_set_offset (bb, bb->ninstr, addr + idx - bb->addr);
|
||||
idx += oplen;
|
||||
|
@ -177,13 +177,14 @@ R_API RAnalData *r_anal_data_new_string(ut64 addr, const char *p, int len, int t
|
||||
} else {
|
||||
ad->str = malloc (len + 1);
|
||||
if (!ad->str) {
|
||||
free (ad);
|
||||
r_anal_data_free(ad);
|
||||
return NULL;
|
||||
}
|
||||
memcpy (ad->str, p, len);
|
||||
ad->str[len] = 0;
|
||||
ad->buf = malloc (len + 1);
|
||||
if (!ad->buf) {
|
||||
r_anal_data_free(ad);
|
||||
eprintf ("Cannot allocate %"PFMT64d" bytes\n", len + 1);
|
||||
return NULL;
|
||||
}
|
||||
|
@ -208,7 +208,7 @@ static int reil_eq(RAnalEsil *esil) {
|
||||
}
|
||||
ins->arg[2] = R_NEW0(RAnalReilArg);
|
||||
if (!ins->arg[2]) {
|
||||
reil_free_inst(ins);
|
||||
reil_free_inst(ins);
|
||||
return false;
|
||||
}
|
||||
reil_make_arg(esil, ins->arg[1], " ");
|
||||
@ -228,21 +228,21 @@ static int reil_eq(RAnalEsil *esil) {
|
||||
if (src_type != ARG_ESIL_INTERNAL && dst_type == ARG_REG) {
|
||||
ins->opcode = REIL_STR;
|
||||
ins->arg[0] = dst;
|
||||
ins->arg[1] = R_NEW0(RAnalReilArg);
|
||||
ins->arg[1] = R_NEW0 (RAnalReilArg);
|
||||
if (!ins->arg[1]) {
|
||||
reil_free_inst (ins);
|
||||
return false;
|
||||
}
|
||||
ins->arg[2] = R_NEW0(RAnalReilArg);
|
||||
ins->arg[2] = R_NEW0 (RAnalReilArg);
|
||||
if (!ins->arg[2]) {
|
||||
reil_free_inst(ins);
|
||||
reil_free_inst (ins);
|
||||
return false;
|
||||
}
|
||||
reil_make_arg(esil, ins->arg[1], " ");
|
||||
get_next_temp_reg(esil, tmp_buf);
|
||||
reil_make_arg(esil, ins->arg[2], tmp_buf);
|
||||
reil_make_arg (esil, ins->arg[1], " ");
|
||||
get_next_temp_reg (esil, tmp_buf);
|
||||
reil_make_arg (esil, ins->arg[2], tmp_buf);
|
||||
ins->arg[2]->size = ins->arg[0]->size;
|
||||
reil_print_inst(esil, ins);
|
||||
reil_print_inst (esil, ins);
|
||||
|
||||
// Used for setting the flags
|
||||
snprintf (esil->Reil->old, sizeof (esil->Reil->old) - 1, "%s:%d",
|
||||
@ -251,8 +251,8 @@ static int reil_eq(RAnalEsil *esil) {
|
||||
dst->size);
|
||||
esil->Reil->lastsz = dst->size;
|
||||
|
||||
R_FREE(ins->arg[1]);
|
||||
R_FREE(ins->arg[2]);
|
||||
R_FREE (ins->arg[1]);
|
||||
R_FREE (ins->arg[2]);
|
||||
}
|
||||
|
||||
// If we are modifying the Instruction Pointer, then we need to emit JCC instead.
|
||||
@ -274,7 +274,7 @@ static int reil_eq(RAnalEsil *esil) {
|
||||
ins->arg[0] = reil_pop_arg(esil);
|
||||
if (!ins->arg[0]) {
|
||||
R_FREE (dst);
|
||||
R_FREE (ins);
|
||||
reil_free_inst (ins);
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -308,8 +308,6 @@ static int reil_binop(RAnalEsil *esil, RAnalReilOpcode opcode) {
|
||||
if (!ins->arg[1]) return false;
|
||||
ins->arg[2] = R_NEW0(RAnalReilArg);
|
||||
if (!ins->arg[2]) {
|
||||
R_FREE (op1);
|
||||
R_FREE (op2);
|
||||
reil_free_inst (ins);
|
||||
return false;
|
||||
}
|
||||
@ -387,8 +385,6 @@ static int reil_cmp(RAnalEsil *esil) {
|
||||
ins->arg[1] = op1;
|
||||
ins->arg[2] = R_NEW0(RAnalReilArg);
|
||||
if (!ins->arg[2]) {
|
||||
R_FREE (op1);
|
||||
R_FREE (op2);
|
||||
reil_free_inst (ins);
|
||||
return false;
|
||||
}
|
||||
@ -524,7 +520,7 @@ static int reil_inceq(RAnalEsil *esil) {
|
||||
static int reil_neg(RAnalEsil *esil) {
|
||||
char tmp_buf[REGBUFSZ];
|
||||
RAnalReilInst *ins;
|
||||
RAnalReilArg *op = reil_pop_arg(esil);
|
||||
RAnalReilArg *op = reil_pop_arg (esil);
|
||||
if (!op) return false;
|
||||
|
||||
ins = R_NEW0 (RAnalReilInst);
|
||||
@ -534,17 +530,15 @@ static int reil_neg(RAnalEsil *esil) {
|
||||
r_anal_esil_pushnum (esil, 0);
|
||||
ins->arg[1] = reil_pop_arg(esil);
|
||||
if (!ins->arg[1]) {
|
||||
R_FREE (op);
|
||||
reil_free_inst (ins);
|
||||
return false;
|
||||
}
|
||||
ins->arg[2] = R_NEW0 (RAnalReilArg);
|
||||
if (!ins->arg[2]) {
|
||||
R_FREE (op);
|
||||
reil_free_inst (ins);
|
||||
return false;
|
||||
}
|
||||
get_next_temp_reg(esil, tmp_buf);
|
||||
get_next_temp_reg (esil, tmp_buf);
|
||||
reil_make_arg(esil, ins->arg[2], tmp_buf);
|
||||
if (ins->arg[0]->size < ins->arg[1]->size)
|
||||
ins->arg[1]->size = ins->arg[0]->size;
|
||||
@ -552,7 +546,7 @@ static int reil_neg(RAnalEsil *esil) {
|
||||
ins->arg[2]->size = 1;
|
||||
reil_print_inst (esil, ins);
|
||||
reil_push_arg (esil, ins->arg[2]);
|
||||
reil_free_inst(ins);
|
||||
reil_free_inst (ins);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -570,21 +564,30 @@ static int reil_negeq(RAnalEsil *esil) {
|
||||
static int reil_not(RAnalEsil *esil) {
|
||||
char tmp_buf[REGBUFSZ];
|
||||
RAnalReilInst *ins;
|
||||
RAnalReilArg *op = reil_pop_arg(esil);
|
||||
RAnalReilArg *op = reil_pop_arg (esil);
|
||||
if (!op) return false;
|
||||
|
||||
ins = R_NEW0 (RAnalReilInst);
|
||||
if (!ins) return false;
|
||||
ins->opcode = REIL_NOT;
|
||||
ins->arg[0] = op;
|
||||
ins->arg[1] = R_NEW0(RAnalReilArg);
|
||||
ins->arg[2] = R_NEW0(RAnalReilArg);
|
||||
reil_make_arg(esil, ins->arg[1], " ");
|
||||
get_next_temp_reg(esil, tmp_buf);
|
||||
reil_make_arg(esil, ins->arg[2], tmp_buf);
|
||||
ins->arg[1] = R_NEW0 (RAnalReilArg);
|
||||
if (!ins->arg[1]) {
|
||||
reil_free_inst (ins);
|
||||
return false;
|
||||
}
|
||||
ins->arg[2] = R_NEW0 (RAnalReilArg);
|
||||
if (!ins->arg[2]) {
|
||||
reil_free_inst (ins);
|
||||
return false;
|
||||
}
|
||||
reil_make_arg (esil, ins->arg[1], " ");
|
||||
get_next_temp_reg (esil, tmp_buf);
|
||||
reil_make_arg (esil, ins->arg[2], tmp_buf);
|
||||
ins->arg[2]->size = ins->arg[0]->size;
|
||||
reil_print_inst(esil, ins);
|
||||
reil_push_arg(esil, ins->arg[2]);
|
||||
reil_free_inst(ins);
|
||||
reil_print_inst (esil, ins);
|
||||
reil_push_arg (esil, ins->arg[2]);
|
||||
reil_free_inst (ins);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -592,22 +595,27 @@ static int reil_if(RAnalEsil *esil) {
|
||||
RAnalReilInst *ins;
|
||||
RAnalReilArg *op2, *op1;
|
||||
|
||||
op2 = reil_pop_arg(esil);
|
||||
op2 = reil_pop_arg (esil);
|
||||
if (!op2) return false;
|
||||
op1 = reil_pop_arg(esil);
|
||||
op1 = reil_pop_arg (esil);
|
||||
if (!op1) {
|
||||
R_FREE (op2);
|
||||
return false;
|
||||
}
|
||||
|
||||
ins = R_NEW0 (RAnalReilInst);
|
||||
if (!ins) return false;
|
||||
ins->opcode = REIL_JCC;
|
||||
ins->arg[0] = op1;
|
||||
ins->arg[2] = op2;
|
||||
ins->arg[1] = R_NEW0(RAnalReilArg);
|
||||
reil_make_arg(esil, ins->arg[1], " ");
|
||||
reil_print_inst(esil, ins);
|
||||
reil_free_inst(ins);
|
||||
ins->arg[1] = R_NEW0 (RAnalReilArg);
|
||||
if (!ins->arg[1]) {
|
||||
reil_free_inst (ins);
|
||||
return false;
|
||||
}
|
||||
reil_make_arg (esil, ins->arg[1], " ");
|
||||
reil_print_inst (esil, ins);
|
||||
reil_free_inst (ins);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -620,10 +628,19 @@ static int reil_peek(RAnalEsil *esil) {
|
||||
if (!op1) return false;
|
||||
|
||||
ins = R_NEW0 (RAnalReilInst);
|
||||
if (!ins) return false;
|
||||
ins->opcode = REIL_LDM;
|
||||
ins->arg[0] = op1;
|
||||
ins->arg[1] = R_NEW0(RAnalReilArg);
|
||||
if (!ins->arg[1]) {
|
||||
reil_free_inst (ins);
|
||||
return false;
|
||||
}
|
||||
ins->arg[2] = R_NEW0(RAnalReilArg);
|
||||
if (!ins->arg[2]) {
|
||||
reil_free_inst (ins);
|
||||
return false;
|
||||
}
|
||||
reil_make_arg(esil, ins->arg[1], " ");
|
||||
get_next_temp_reg(esil, tmp_buf);
|
||||
reil_make_arg(esil, ins->arg[2], tmp_buf);
|
||||
@ -637,26 +654,30 @@ static int reil_peek(RAnalEsil *esil) {
|
||||
// n = 8, 4, 2, 1
|
||||
static int reil_peekn(RAnalEsil *esil, ut8 n) {
|
||||
RAnalReilArg *op2;
|
||||
RAnalReilArg *op1 = reil_pop_arg(esil);
|
||||
RAnalReilArg *op1 = reil_pop_arg (esil);
|
||||
if (!op1) return false;
|
||||
|
||||
reil_push_arg(esil, op1);
|
||||
reil_peek(esil);
|
||||
reil_push_arg (esil, op1);
|
||||
reil_peek (esil);
|
||||
// No need to cast if n = 0
|
||||
if (n == 0) {
|
||||
R_FREE(op1);
|
||||
R_FREE (op1);
|
||||
return true;
|
||||
}
|
||||
|
||||
R_FREE(op1);
|
||||
op1 = reil_pop_arg(esil);
|
||||
R_FREE (op1);
|
||||
op1 = reil_pop_arg (esil);
|
||||
if (!op1) return false;
|
||||
|
||||
op2 = R_NEW0(RAnalReilArg);
|
||||
op2 = R_NEW0 (RAnalReilArg);
|
||||
if (!op2) {
|
||||
R_FREE (op1);
|
||||
return false;
|
||||
}
|
||||
op2->size = n * 8;
|
||||
op2->type = ARG_TEMP;
|
||||
get_next_temp_reg(esil, op2->name);
|
||||
reil_cast_size(esil, op1, op2);
|
||||
get_next_temp_reg (esil, op2->name);
|
||||
reil_cast_size (esil, op1, op2);
|
||||
esil->Reil->lastsz = 8 * n;
|
||||
|
||||
R_FREE (op2);
|
||||
@ -674,9 +695,9 @@ static int reil_poken(RAnalEsil *esil, ut8 n) {
|
||||
RAnalReilInst *ins;
|
||||
RAnalReilArg *op2, *op1;
|
||||
|
||||
op2 = reil_pop_arg(esil);
|
||||
op2 = reil_pop_arg (esil);
|
||||
if (!op2) return false;
|
||||
op1 = reil_pop_arg(esil);
|
||||
op1 = reil_pop_arg (esil);
|
||||
if (!op1) {
|
||||
R_FREE (op2);
|
||||
return false;
|
||||
@ -684,39 +705,54 @@ static int reil_poken(RAnalEsil *esil, ut8 n) {
|
||||
|
||||
if (op1->type != ARG_ESIL_INTERNAL) {
|
||||
ins = R_NEW0 (RAnalReilInst);
|
||||
if (!ins) return false;
|
||||
ins->opcode = REIL_LDM;
|
||||
ins->arg[0] = op2;
|
||||
ins->arg[1] = R_NEW0(RAnalReilArg);
|
||||
if (!ins->arg[1]) {
|
||||
R_FREE (op1);
|
||||
reil_free_inst (ins);
|
||||
return false;
|
||||
}
|
||||
ins->arg[2] = R_NEW0(RAnalReilArg);
|
||||
reil_make_arg(esil, ins->arg[1], " ");
|
||||
get_next_temp_reg(esil, tmp_buf);
|
||||
reil_make_arg(esil, ins->arg[2], tmp_buf);
|
||||
if (!ins->arg[2]) {
|
||||
R_FREE (op1);
|
||||
reil_free_inst (ins);
|
||||
return false;
|
||||
}
|
||||
reil_make_arg (esil, ins->arg[1], " ");
|
||||
get_next_temp_reg (esil, tmp_buf);
|
||||
reil_make_arg (esil, ins->arg[2], tmp_buf);
|
||||
ins->arg[2]->size = ins->arg[0]->size;
|
||||
reil_print_inst(esil, ins);
|
||||
snprintf(esil->Reil->old, sizeof (esil->Reil->old) - 1, "%s:%d",
|
||||
reil_print_inst (esil, ins);
|
||||
snprintf (esil->Reil->old, sizeof (esil->Reil->old) - 1, "%s:%d",
|
||||
ins->arg[2]->name, ins->arg[2]->size);
|
||||
snprintf(esil->Reil->cur, sizeof (esil->Reil->cur) - 1, "%s:%d", op2->name,
|
||||
snprintf (esil->Reil->cur, sizeof (esil->Reil->cur) - 1, "%s:%d", op2->name,
|
||||
op2->size);
|
||||
esil->lastsz = n * 8;
|
||||
reil_push_arg(esil, op1);
|
||||
reil_push_arg(esil, op2);
|
||||
R_FREE(op1);
|
||||
reil_free_inst(ins);
|
||||
reil_push_arg (esil, op1);
|
||||
reil_push_arg (esil, op2);
|
||||
R_FREE (op1);
|
||||
reil_free_inst (ins);
|
||||
} else {
|
||||
reil_flag_spew_inst(esil, op1->name + 1);
|
||||
R_FREE(op1);
|
||||
op1 = reil_pop_arg(esil);
|
||||
reil_push_arg(esil, op2);
|
||||
reil_push_arg(esil, op1);
|
||||
R_FREE(op2);
|
||||
R_FREE(op1);
|
||||
reil_flag_spew_inst (esil, op1->name + 1);
|
||||
R_FREE (op1);
|
||||
op1 = reil_pop_arg (esil);
|
||||
reil_push_arg (esil, op2);
|
||||
reil_push_arg (esil, op1);
|
||||
R_FREE (op2);
|
||||
R_FREE (op1);
|
||||
}
|
||||
|
||||
ins = R_NEW0 (RAnalReilInst);
|
||||
if (!ins) return false;
|
||||
ins->opcode = REIL_STM;
|
||||
ins->arg[2] = reil_pop_arg(esil);
|
||||
ins->arg[0] = reil_pop_arg(esil);
|
||||
ins->arg[1] = R_NEW0(RAnalReilArg);
|
||||
ins->arg[2] = reil_pop_arg (esil);
|
||||
ins->arg[0] = reil_pop_arg (esil);
|
||||
ins->arg[1] = R_NEW0 (RAnalReilArg);
|
||||
if (!ins->arg[1]) {
|
||||
reil_free_inst (ins);
|
||||
}
|
||||
reil_make_arg(esil, ins->arg[1], " ");
|
||||
reil_print_inst(esil, ins);
|
||||
reil_free_inst(ins);
|
||||
@ -724,7 +760,7 @@ static int reil_poken(RAnalEsil *esil, ut8 n) {
|
||||
}
|
||||
|
||||
static int reil_poke(RAnalEsil *esil) {
|
||||
return reil_poken(esil, esil->anal->bits / 8);
|
||||
return reil_poken (esil, esil->anal->bits / 8);
|
||||
}
|
||||
|
||||
static int reil_poke1(RAnalEsil *esil) { return reil_poken(esil, 1); }
|
||||
@ -737,9 +773,9 @@ static int reil_mem_bineq_n(RAnalEsil *esil, RAnalReilOpcode opcode, ut8 size) {
|
||||
int ret = 1;
|
||||
RAnalReilArg *op2, *op1;
|
||||
|
||||
op2 = reil_pop_arg(esil);
|
||||
op2 = reil_pop_arg (esil);
|
||||
if (!op2) return false;
|
||||
op1 = reil_pop_arg(esil);
|
||||
op1 = reil_pop_arg (esil);
|
||||
if (!op1) {
|
||||
R_FREE (op2);
|
||||
return false;
|
||||
|
@ -1247,9 +1247,13 @@ R_API int r_anal_str_to_fcn(RAnal *a, RAnalFunction *f, const char *sig) {
|
||||
}
|
||||
|
||||
/* Add 'function' keyword */
|
||||
str = malloc(strlen(sig) + 10);
|
||||
strcpy(str, "function ");
|
||||
strcat(str, sig);
|
||||
str = malloc (strlen(sig) + 10);
|
||||
if (!str) {
|
||||
eprintf ("Cannot allocate %"PFMT64d" bytes\n", strlen(sig) + 10);
|
||||
return false;
|
||||
}
|
||||
strcpy (str, "function ");
|
||||
strcat (str, sig);
|
||||
|
||||
/* TODO: improve arguments parsing */
|
||||
/* TODO: implement parser */
|
||||
|
@ -865,6 +865,7 @@ static ut8 parse_leaf (const RAnal *anal, RBuffer *b, RFlirtNode *node) {
|
||||
|
||||
do { // loop for all modules having the same crc
|
||||
module = R_NEW0(RFlirtModule);
|
||||
if (!module) goto err_exit;
|
||||
|
||||
module->crc_length = crc_length;
|
||||
module->crc16 = crc16;
|
||||
|
@ -402,7 +402,7 @@ static void printmetaitem(RAnal *a, RAnalMetaItem *d, int rad) {
|
||||
} else {
|
||||
// TODO: use b64 here
|
||||
a->cb_printf ("0x%08"PFMT64x" array[%d] %s %s\n",
|
||||
d->from, (int)d->size,
|
||||
d->from, (int)d->size,
|
||||
r_meta_type_to_string (d->type), pstr);
|
||||
}
|
||||
break;
|
||||
@ -434,7 +434,10 @@ static int meta_print_item(void *user, const char *k, const char *v) {
|
||||
it.str = strchr (v2+1, ',');
|
||||
if (it.str)
|
||||
it.str = (char *)sdb_decode ((const char*)it.str+1, 0);
|
||||
else it.str = strdup (it.str? it.str: ""); // don't break in free
|
||||
else {
|
||||
it.str = strdup (it.str? it.str: ""); // don't break in free
|
||||
if (!it.str) goto beach
|
||||
}
|
||||
printmetaitem (ui->anal, &it, ui->rad);
|
||||
free (it.str);
|
||||
beach:
|
||||
@ -475,14 +478,19 @@ static int meta_enumerate_cb(void *user, const char *k, const char *v) {
|
||||
it->to = it->from + it->size;
|
||||
v2 = strchr (v, ',');
|
||||
if (!v2) {
|
||||
free (it);
|
||||
free (it);
|
||||
goto beach;
|
||||
}
|
||||
it->space = atoi (v2+1);
|
||||
it->str = strchr (v2+1, ',');
|
||||
|
||||
if (it->str)
|
||||
if (it->str) {
|
||||
it->str = (char *)sdb_decode ((const char*)it->str+1, 0);
|
||||
} else {
|
||||
free(it);
|
||||
goto beach;
|
||||
|
||||
}
|
||||
//printmetaitem (ui->anal, &it, ui->rad);
|
||||
r_list_append (list, it);
|
||||
beach:
|
||||
|
@ -13,6 +13,7 @@ R_API RAnalValue *r_anal_value_new_from_string(const char *str) {
|
||||
|
||||
R_API RAnalValue *r_anal_value_copy (RAnalValue *ov) {
|
||||
RAnalValue *v = R_NEW (RAnalValue);
|
||||
if (!v) return NULL;
|
||||
memcpy (v, ov, sizeof (RAnalValue));
|
||||
// reference to reg and regdelta should be kept
|
||||
return v;
|
||||
|
@ -221,6 +221,7 @@ R_API RAnalVar *r_anal_var_get (RAnal *a, ut64 addr, char kind, int scope, int d
|
||||
sdb_fmt_tobin (vardef, SDB_VARTYPE_FMT, &vt);
|
||||
|
||||
av = R_NEW0 (RAnalVar);
|
||||
if (!av) return NULL
|
||||
av->addr = addr;
|
||||
av->scope = scope;
|
||||
av->delta = delta;
|
||||
@ -373,7 +374,7 @@ R_API RList *r_anal_var_list(RAnal *a, RAnalFunction *fcn, int kind) {
|
||||
RList *list = NULL;
|
||||
if (!a || !fcn)
|
||||
return NULL;
|
||||
list = r_list_new ();
|
||||
list = r_list_new ();
|
||||
if (!kind) kind = 'v'; // by default show vars
|
||||
varlist = sdb_get (DB, sdb_fmt (0, "fcn.0x%"PFMT64x".%c",
|
||||
fcn->addr, kind), 0);
|
||||
@ -392,6 +393,7 @@ R_API RList *r_anal_var_list(RAnal *a, RAnalFunction *fcn, int kind) {
|
||||
sdb_fmt_tobin (vardef, SDB_VARTYPE_FMT, &vt);
|
||||
RAnalVar *av;
|
||||
av = R_NEW0 (RAnalVar);
|
||||
if (!av) return NULL;
|
||||
av->delta = delta;
|
||||
av->kind = kind;
|
||||
av->name = strdup (vt.name);
|
||||
|
Loading…
x
Reference in New Issue
Block a user