Fixes crash in the disasm and assert for the folded bb feature (#13440)

This commit is contained in:
radare 2019-03-20 02:02:04 +01:00 committed by GitHub
parent f6199df12e
commit e91dbd8091
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -230,6 +230,7 @@ typedef struct {
ut64 esil_old_pc;
ut8* esil_regstate;
int esil_regstate_size;
bool esil_likely;
int l;
@ -505,7 +506,10 @@ static void ds_print_esil_anal_fini(RDisasmState *ds) {
RCore* core = ds->core;
core->anal->last_disasm_reg = r_reg_arena_peek (core->anal->reg);
const char *pc = r_reg_get_name (core->anal->reg, R_REG_NAME_PC);
r_reg_arena_poke (core->anal->reg, ds->esil_regstate);
RRegSet *regset = r_reg_regset_get (ds->core->anal->reg, R_REG_TYPE_GPR);
if (ds->esil_regstate_size == regset->arena->size) {
r_reg_arena_poke (core->anal->reg, ds->esil_regstate);
}
r_reg_setv (core->anal->reg, pc, ds->esil_old_pc);
R_FREE (ds->esil_regstate);
}
@ -4085,6 +4089,10 @@ static void ds_print_esil_anal_init(RDisasmState *ds) {
r_reg_setv (core->anal->reg, "gp", core->anal->gp);
}
ds->esil_regstate = r_reg_arena_peek (core->anal->reg);
RRegSet *regset = r_reg_regset_get (core->anal->reg, R_REG_TYPE_GPR);
if (ds->esil_regstate && regset) {
ds->esil_regstate_size = regset->arena->size;
}
// TODO: emulate N instructions BEFORE the current offset to get proper full function emulation
ds_pre_emulation (ds);
@ -4989,14 +4997,18 @@ toro:
RAnalFunction *fcn = f;
if (fcn) {
RAnalBlock *bb = r_anal_fcn_bbget_in (core->anal, fcn, ds->at);
if (!bb) {
fcn = r_anal_get_fcn_at (core->anal, ds->at, 0);
if (fcn) {
bb = r_anal_fcn_bbget_in (core->anal, fcn, ds->at);
}
}
if (bb) {
if (bb->folded) {
r_cons_printf ("[+] Folded BB [..0x%08"PFMT64x"]\n", ds->at + bb->size);
inc = bb->size;
continue;
}
} else {
r_warn_if_reached ();
}
}
////