mirror of
https://github.com/radareorg/radare2.git
synced 2025-02-15 11:48:12 +00:00
Fix more memory leaks related to r_arch and x86.cs
This commit is contained in:
parent
92eb709d8c
commit
e27fce59ec
@ -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);
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user