Skip to contentSkip to conversation

tracing: Various memory leak fixes

GIT PULL New Steven Rostedt 1 participant 4 messages Dec 11, 2018

Subsystems (3)
lore
Share & tools
lore

Steven Rostedt

author maintainer
#0 lore raw

Linus,

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.

Please pull the latest trace-v4.20-rc6 tree, which can be found at:

git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace.git
trace-v4.20-rc6

Tag SHA1: 4e790ad722f2a0e23f8e36f307c23b07924235ed Head SHA1: 2840f84f74035e5a535959d5f17269c69fa6edc5

Steven Rostedt (VMware) (3):
tracing: Fix memory leak in create_filter()
tracing: Fix memory leak in set_trigger_filter()
tracing: Fix memory leak of instance function hash filters

----

 kernel/trace/ftrace.c               | 1 +
 kernel/trace/trace_events_filter.c  | 5 ++++-
 kernel/trace/trace_events_trigger.c | 6 ++++--
 3 files changed, 9 insertions(+), 3 deletions(-)
author maintainer
#1 lore raw

PATCH 1/3 tracing: Fix memory leak in create_filter()

From: "Steven Rostedt (VMware)" <[email protected]>

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.

Fixes 80765597bc587 ("tracing: Rewrite filter logic to be simpler and faster")
---
 kernel/trace/trace_events_filter.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)
kernel/trace/trace_events_filter.c +4 -1
index 84a65173b1e9..5574e862de8d 100644
@@ -570,11 +570,13 @@ predicate_parse(const char *str, int nr_parens, int nr_preds,
 		}
 	}
 
+	kfree(op_stack);
+	kfree(inverts);
 	return prog;
 out_free:
 	kfree(op_stack);
-	kfree(prog_stack);
 	kfree(inverts);
+	kfree(prog_stack);
 	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);
 	if (err && set_str)
 		append_filter_err(pe, *filterp);
+	create_filter_finish(pe);
 
 	return err;
 }
Signature · 1 line
2.19.1
author maintainer
#2 lore raw

PATCH 2/3 tracing: Fix memory leak in set_trigger_filter()

In reply to Steven Rostedt

From: "Steven Rostedt (VMware)" <[email protected]>

When create_event_filter() fails in set_trigger_filter(), the filter may still be allocated and needs to be freed. The caller expects the data->filter to be updated with the new filter, even if the new filter failed (we could add an error message by setting set_str parameter of create_event_filter(), but that's another update).

But because the error would just exit, filter was left hanging and nothing could free it.

Found by kmemleak detector.

Fixes bac5fb97a173a ("tracing: Add and use generic set_trigger_filter() implementation")
---
 kernel/trace/trace_events_trigger.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)
kernel/trace/trace_events_trigger.c +4 -2
index 2152d1e530cb..cd12ecb66eb9 100644
@@ -732,8 +732,10 @@ int set_trigger_filter(char *filter_str,
 
 	/* The filter is for the 'trigger' event, not the triggered event */
 	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:
 	tmp = rcu_access_pointer(data->filter);
 
Signature · 1 line
2.19.1
author maintainer
#3 lore raw

PATCH 3/3 tracing: Fix memory leak of instance function hash filters

In reply to Steven Rostedt

From: "Steven Rostedt (VMware)" <[email protected]>

The following commands will cause a memory leak:

 # cd /sys/kernel/tracing
 # mkdir instances/foo
 # echo schedule > instance/foo/set_ftrace_filter
 # rmdir instances/foo

The reason is that the hashes that hold the filters to set_ftrace_filter and set_ftrace_notrace are not freed if they contain any data on the instance and the instance is removed.

Found by kmemleak detector.

Fixes 591dffdade9f ("ftrace: Allow for function tracing instance to filter functions")
---
 kernel/trace/ftrace.c | 1 +
 1 file changed, 1 insertion(+)
kernel/trace/ftrace.c +1 -0
index 77734451cb05..e23eb9fc77aa 100644
@@ -5460,6 +5460,7 @@ void ftrace_destroy_filter_files(struct ftrace_ops *ops)
 	if (ops->flags & FTRACE_OPS_FL_ENABLED)
 		ftrace_shutdown(ops, 0);
 	ops->flags |= FTRACE_OPS_FL_DELETED;
+	ftrace_free_filter(ops);
 	mutex_unlock(&ftrace_lock);
 }
 
Signature · 1 line
2.19.1