History

tracing: Fix memory leak in create_filter()

The create_filter() calls create_filter_start() which allocates a "parse_error" descriptor, but fails to call create_filter_finish() that frees it. The op_stack and inverts in predicate_parse() were also not freed. Found by kmemleak detector.

Steven Rostedt (VMware) committed 7 years ago

Commit b61c1921 parent 1aed58e1 file · +4 −1Browse files

Unified · Split

kernel/trace/trace_events_filter.c+4−1
@@ -570,11 +570,13 @@ predicate_parse(const char *str, int nr_parens, int nr_preds, · 569 unmodified lines
570 }570 }
571 }571 }
572 572
573 kfree(op_stack);
574 kfree(inverts);
573 return prog;575 return prog;
574out_free:576out_free:
575 kfree(op_stack);577 kfree(op_stack);
576 kfree(prog_stack);
577 kfree(inverts);578 kfree(inverts);
579 kfree(prog_stack);
578 return ERR_PTR(ret);580 return ERR_PTR(ret);
579}581}
580 582
@@ -1718,6 +1720,7 @@ static int create_filter(struct trace_event_call *call, · 1137 unmodified lines
1718 err = process_preds(call, filter_string, *filterp, pe);1720 err = process_preds(call, filter_string, *filterp, pe);
1719 if (err && set_str)1721 if (err && set_str)
1720 append_filter_err(pe, *filterp);1722 append_filter_err(pe, *filterp);
1723 create_filter_finish(pe);
1721 1724
1722 return err;1725 return err;
1723}1726}