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

Showing the changes to kernel (1 of 1 file). Show all

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
570570 }
571571 }
572572
573+ kfree(op_stack);
574+ kfree(inverts);
573575 return prog;
574576 out_free:
575577 kfree(op_stack);
576− kfree(prog_stack);
577578 kfree(inverts);
579+ kfree(prog_stack);
578580 return ERR_PTR(ret);
579581 }
580582
@@ -1718,6 +1720,7 @@ static int create_filter(struct trace_event_call *call, · 1137 unmodified lines
17181720 err = process_preds(call, filter_string, *filterp, pe);
17191721 if (err && set_str)
17201722 append_filter_err(pe, *filterp);
1723+ create_filter_finish(pe);
17211724
17221725 return err;
17231726 }