mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-03-19 05:24:11 +00:00
While running various ftrace tests on new development code, the kmemleak
detector found some allocations that were not freed correctly. This fixes a couple of leaks in the event trigger code as well as in adding function trace filters in trace instances. -----BEGIN PGP SIGNATURE----- iIoEABYIADIWIQRRSw7ePDh/lE+zeZMp5XQQmuv6qgUCXBAHphQccm9zdGVkdEBn b29kbWlzLm9yZwAKCRAp5XQQmuv6qphzAP4mTz45V9gq9vyXCVPPzg8T6lV4ZjJh bPaumlHGumaJHAD9FipqlhCOCVfv8Qyxv5iWuBpoGKcp37ULb6d+dtM+qg4= =S1FK -----END PGP SIGNATURE----- Merge tag 'trace-v4.20-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace Pull tracing fixes from Steven Rostedt: "While running various ftrace tests on new development code, the kmemleak detector found some allocations that were not freed correctly. This fixes a couple of leaks in the event trigger code as well as in adding function trace filters in trace instances" * tag 'trace-v4.20-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace: tracing: Fix memory leak of instance function hash filters tracing: Fix memory leak in set_trigger_filter() tracing: Fix memory leak in create_filter()
This commit is contained in:
commit
b5884002dc
3 changed files with 9 additions and 3 deletions
|
@ -5460,6 +5460,7 @@ void ftrace_destroy_filter_files(struct ftrace_ops *ops)
|
||||||
if (ops->flags & FTRACE_OPS_FL_ENABLED)
|
if (ops->flags & FTRACE_OPS_FL_ENABLED)
|
||||||
ftrace_shutdown(ops, 0);
|
ftrace_shutdown(ops, 0);
|
||||||
ops->flags |= FTRACE_OPS_FL_DELETED;
|
ops->flags |= FTRACE_OPS_FL_DELETED;
|
||||||
|
ftrace_free_filter(ops);
|
||||||
mutex_unlock(&ftrace_lock);
|
mutex_unlock(&ftrace_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -570,11 +570,13 @@ predicate_parse(const char *str, int nr_parens, int nr_preds,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
kfree(op_stack);
|
||||||
|
kfree(inverts);
|
||||||
return prog;
|
return prog;
|
||||||
out_free:
|
out_free:
|
||||||
kfree(op_stack);
|
kfree(op_stack);
|
||||||
kfree(prog_stack);
|
|
||||||
kfree(inverts);
|
kfree(inverts);
|
||||||
|
kfree(prog_stack);
|
||||||
return ERR_PTR(ret);
|
return ERR_PTR(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1718,6 +1720,7 @@ static int create_filter(struct trace_event_call *call,
|
||||||
err = process_preds(call, filter_string, *filterp, pe);
|
err = process_preds(call, filter_string, *filterp, pe);
|
||||||
if (err && set_str)
|
if (err && set_str)
|
||||||
append_filter_err(pe, *filterp);
|
append_filter_err(pe, *filterp);
|
||||||
|
create_filter_finish(pe);
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
|
@ -732,8 +732,10 @@ int set_trigger_filter(char *filter_str,
|
||||||
|
|
||||||
/* The filter is for the 'trigger' event, not the triggered event */
|
/* The filter is for the 'trigger' event, not the triggered event */
|
||||||
ret = create_event_filter(file->event_call, filter_str, false, &filter);
|
ret = create_event_filter(file->event_call, filter_str, false, &filter);
|
||||||
if (ret)
|
/*
|
||||||
goto out;
|
* If create_event_filter() fails, filter still needs to be freed.
|
||||||
|
* Which the calling code will do with data->filter.
|
||||||
|
*/
|
||||||
assign:
|
assign:
|
||||||
tmp = rcu_access_pointer(data->filter);
|
tmp = rcu_access_pointer(data->filter);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue