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.
Showing the changes to kernel (1 of 1 file). Show all
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 | return prog; | 575 | return prog; |
| 574 | out_free: | 576 | out_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 | } |