Fix more memory leaks related to r_arch and x86.cs

This commit is contained in:
pancake 2022-10-17 21:46:55 +02:00 committed by pancake
parent 92eb709d8c
commit e27fce59ec
6 changed files with 24 additions and 11 deletions

View File

@ -529,6 +529,7 @@ static inline bool has_vars(RAnal *anal, ut64 addr) {
}
static int fcn_recurse(RAnal *anal, RAnalFunction *fcn, ut64 addr, ut64 len, int depth) {
RRegItem *variadic_reg = NULL;
ReadAhead ra = {0};
ra.cache_addr = UT64_MAX; // invalidate the cache
char *bp_reg = NULL;
@ -574,11 +575,6 @@ static int fcn_recurse(RAnal *anal, RAnalFunction *fcn, ut64 addr, ut64 len, int
const bool is_x86 = is_arm ? false: anal->cur->arch && !strncmp (anal->cur->arch, "x86", 3);
const bool is_amd64 = is_x86 ? fcn->cc && !strcmp (fcn->cc, "amd64") : false;
const bool is_dalvik = is_x86 ? false : anal->cur->arch && !strncmp (anal->cur->arch, "dalvik", 6);
RRegItem *variadic_reg = NULL;
if (is_amd64) {
variadic_reg = r_reg_get (anal->reg, "rax", R_REG_TYPE_GPR);
}
bool has_variadic_reg = !!variadic_reg;
if (r_cons_is_breaked ()) {
return R_ANAL_RET_END;
@ -674,6 +670,10 @@ static int fcn_recurse(RAnal *anal, RAnalFunction *fcn, ut64 addr, ut64 len, int
bp_reg = strdup (_bp_reg);
sp_reg = strdup (_sp_reg);
}
if (is_amd64) {
variadic_reg = r_reg_get (anal->reg, "rax", R_REG_TYPE_GPR);
}
bool has_variadic_reg = !!variadic_reg;
op = r_anal_op_new ();
while (addrbytes * idx < maxlen) {
@ -1449,6 +1449,7 @@ analopfinish:
last_is_mov_lr_pc = false;
}
if (has_variadic_reg && !fcn->is_variadic) {
r_unref (variadic_reg);
variadic_reg = r_reg_get (anal->reg, "rax", R_REG_TYPE_GPR);
bool dst_is_variadic = dst && dst->reg
&& variadic_reg && dst->reg->offset == variadic_reg->offset;
@ -1463,6 +1464,7 @@ analopfinish:
}
}
beach:
r_unref (variadic_reg);
free (op_src);
free (op_dst);
free (bp_reg);

View File

@ -1503,7 +1503,6 @@ static void anop_esil(RAnal *a, RAnalOp *op, ut64 addr, const ut8 *buf, int len,
src = getarg (&gop, 0, 0, NULL, NULL);
val = r_vector_push (&op->srcs, NULL);
val->reg = r_reg_get (a->reg, src, R_REG_TYPE_GPR);
//XXX fallthrough
free (src);
}
//case X86_OP_FP:
@ -2360,7 +2359,9 @@ static RRegItem *cs_reg2reg(RReg *reg, csh *h, int id) {
if (id == X86_REG_INVALID) {
return NULL;
}
return r_reg_get (reg, (char *)cs_reg_name (*h, id), -1);
RRegItem *ri = r_reg_get (reg, (char *)cs_reg_name (*h, id), -1);
// r_unref (ri); // XXX this fixes the refleak but its not correct
return ri;
}
static void set_access_info(RReg *reg, RAnalOp *op, csh *handle, cs_insn *insn, int mode) {

View File

@ -50,6 +50,6 @@ R_API RArchConfig *r_arch_config_new(void) {
ac->syntax = R_ARCH_SYNTAX_INTEL;
r_ref_init (ac, &_ac_free);
ac->endian = R_SYS_ENDIAN_NONE;
r_ref (ac);
// r_ref (ac);
return (RArchConfig *)ac;
}

View File

@ -214,7 +214,6 @@ R_API bool r_arch_set_arch(RArch *arch, char *archname) {
cfg->arch =_arch;
if (!r_arch_use (arch, cfg)) {
r_unref (cfg);
arch->cfg = NULL;
return false;
}
return true;

View File

@ -3562,8 +3562,7 @@ static int agraph_refresh(struct agraph_refresh_data *grd) {
if (g->is_instep && r_config_get_b (core->config, "cfg.debug")) {
// seek only when the graph node changes
const char *pc = r_reg_get_name (core->dbg->reg, R_REG_NAME_PC);
RRegItem *r = r_reg_get (core->dbg->reg, pc, -1);
ut64 addr = r_reg_get_value (core->dbg->reg, r);
ut64 addr = r_reg_getv (core->dbg->reg, pc);
RANode *acur = get_anode (g->curnode);
addr = r_anal_get_bbaddr (core->anal, addr);

View File

@ -3104,9 +3104,21 @@ R_API bool r_core_init(RCore *core) {
core->rasm->num = core->num;
r_asm_set_user_ptr (core->rasm, core);
core->anal = r_anal_new ();
#if 1
r_unref (core->print->config);
r_unref (core->anal->config);
r_unref (core->anal->reg->config);
r_ref (core->rasm->config);
core->print->config = core->rasm->config;
r_ref (core->rasm->config);
core->anal->config = core->rasm->config;
r_ref (core->rasm->config);
core->anal->reg->config=core->rasm->config;
#else
r_ref_set (core->print->config, core->rasm->config);
r_ref_set (core->anal->config, core->rasm->config);
r_ref_set (core->anal->reg->config, core->rasm->config);
#endif
// RAnal.new() doesnt initializes this field. but it should be refcounted
core->anal->print = core->print;
r_anal_set_bits (core->anal, 32); // core->rasm->config->bits);