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.
Unified · Split
| @@ -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 | 575 | return prog; |
| 574 | 576 | out_free: |
| 575 | 577 | kfree(op_stack); |
| 576 | − kfree(prog_stack); | |
| 577 | 578 | kfree(inverts); |
| 579 | + kfree(prog_stack); | |
| 578 | 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 | 1720 | err = process_preds(call, filter_string, *filterp, pe); |
| 1719 | 1721 | if (err && set_str) |
| 1720 | 1722 | append_filter_err(pe, *filterp); |
| 1723 | + create_filter_finish(pe); | |
| 1721 | 1724 | |
| 1722 | 1725 | return err; |
| 1723 | 1726 | } |