From e27fce59ecdca80709e829fe052f9968931f2b4d Mon Sep 17 00:00:00 2001 From: pancake Date: Mon, 17 Oct 2022 21:46:55 +0200 Subject: [PATCH] Fix more memory leaks related to r_arch and x86.cs --- libr/anal/fcn.c | 12 +++++++----- libr/anal/p/anal_x86_cs.c | 5 +++-- libr/arch/aconfig.c | 2 +- libr/arch/arch.c | 1 - libr/core/agraph.c | 3 +-- libr/core/core.c | 12 ++++++++++++ 6 files changed, 24 insertions(+), 11 deletions(-) diff --git a/libr/anal/fcn.c b/libr/anal/fcn.c index c39a74b6f3..17390f06cb 100644 --- a/libr/anal/fcn.c +++ b/libr/anal/fcn.c @@ -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); diff --git a/libr/anal/p/anal_x86_cs.c b/libr/anal/p/anal_x86_cs.c index 52684f1d9a..741f2edecb 100644 --- a/libr/anal/p/anal_x86_cs.c +++ b/libr/anal/p/anal_x86_cs.c @@ -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) { diff --git a/libr/arch/aconfig.c b/libr/arch/aconfig.c index 0407ec202d..02ca67b67a 100644 --- a/libr/arch/aconfig.c +++ b/libr/arch/aconfig.c @@ -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; } diff --git a/libr/arch/arch.c b/libr/arch/arch.c index 35b81157c0..26c86ae15f 100644 --- a/libr/arch/arch.c +++ b/libr/arch/arch.c @@ -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; diff --git a/libr/core/agraph.c b/libr/core/agraph.c index 925c509376..340b96b671 100644 --- a/libr/core/agraph.c +++ b/libr/core/agraph.c @@ -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); diff --git a/libr/core/core.c b/libr/core/core.c index fbe7d81a0e..bef5f14b3e 100644 --- a/libr/core/core.c +++ b/libr/core/core.c @@ -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);