diff options
Diffstat (limited to 'tools/perf/util/annotate.c')
| -rw-r--r-- | tools/perf/util/annotate.c | 20 | 
1 files changed, 15 insertions, 5 deletions
| diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c index 79999ceaf2be..61bf9128e1f2 100644 --- a/tools/perf/util/annotate.c +++ b/tools/perf/util/annotate.c @@ -177,14 +177,17 @@ static int lock__parse(struct ins_operands *ops)  		goto out_free_ops;  	ops->locked.ins = ins__find(name); +	free(name); +  	if (ops->locked.ins == NULL)  		goto out_free_ops;  	if (!ops->locked.ins->ops)  		return 0; -	if (ops->locked.ins->ops->parse) -		ops->locked.ins->ops->parse(ops->locked.ops); +	if (ops->locked.ins->ops->parse && +	    ops->locked.ins->ops->parse(ops->locked.ops) < 0) +		goto out_free_ops;  	return 0; @@ -208,6 +211,13 @@ static int lock__scnprintf(struct ins *ins, char *bf, size_t size,  static void lock__delete(struct ins_operands *ops)  { +	struct ins *ins = ops->locked.ins; + +	if (ins && ins->ops->free) +		ins->ops->free(ops->locked.ops); +	else +		ins__delete(ops->locked.ops); +  	zfree(&ops->locked.ops);  	zfree(&ops->target.raw);  	zfree(&ops->target.name); @@ -229,7 +239,7 @@ static int mov__parse(struct ins_operands *ops)  	*s = '\0';  	ops->source.raw = strdup(ops->raw);  	*s = ','; -	 +  	if (ops->source.raw == NULL)  		return -1; @@ -531,8 +541,8 @@ static void disasm_line__init_ins(struct disasm_line *dl)  	if (!dl->ins->ops)  		return; -	if (dl->ins->ops->parse) -		dl->ins->ops->parse(&dl->ops); +	if (dl->ins->ops->parse && dl->ins->ops->parse(&dl->ops) < 0) +		dl->ins = NULL;  }  static int disasm_line__parse(char *line, char **namep, char **rawp) |