diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2020-11-08 10:05:10 -0800 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2020-11-08 10:05:10 -0800 |
commit | 100e38914a025a2fc797aa887efee15d812e9f83 (patch) | |
tree | 3839c5a7a97f74da3f30920e1d353e258b422959 | |
parent | aaaaa7ecdc0b46fe56e8192545321ce44d85236e (diff) | |
parent | 7bdb157cdebbf95a1cd94ed2e01b338714075d00 (diff) | |
download | linux-stable-100e38914a025a2fc797aa887efee15d812e9f83.tar.gz linux-stable-100e38914a025a2fc797aa887efee15d812e9f83.tar.bz2 linux-stable-100e38914a025a2fc797aa887efee15d812e9f83.zip |
Merge tag 'perf-urgent-2020-11-08' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull perf fix from Thomas Gleixner:
"A single fix for the perf core plugging a memory leak in the address
filter parser"
* tag 'perf-urgent-2020-11-08' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
perf/core: Fix a memory leak in perf_event_parse_addr_filter()
-rw-r--r-- | kernel/events/core.c | 12 |
1 files changed, 5 insertions, 7 deletions
diff --git a/kernel/events/core.c b/kernel/events/core.c index da467e1dd49a..5a29ab09e72d 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -10085,6 +10085,7 @@ perf_event_parse_addr_filter(struct perf_event *event, char *fstr, if (token == IF_SRC_FILE || token == IF_SRC_FILEADDR) { int fpos = token == IF_SRC_FILE ? 2 : 1; + kfree(filename); filename = match_strdup(&args[fpos]); if (!filename) { ret = -ENOMEM; @@ -10131,16 +10132,13 @@ perf_event_parse_addr_filter(struct perf_event *event, char *fstr, */ ret = -EOPNOTSUPP; if (!event->ctx->task) - goto fail_free_name; + goto fail; /* look up the path and grab its inode */ ret = kern_path(filename, LOOKUP_FOLLOW, &filter->path); if (ret) - goto fail_free_name; - - kfree(filename); - filename = NULL; + goto fail; ret = -EINVAL; if (!filter->path.dentry || @@ -10160,13 +10158,13 @@ perf_event_parse_addr_filter(struct perf_event *event, char *fstr, if (state != IF_STATE_ACTION) goto fail; + kfree(filename); kfree(orig); return 0; -fail_free_name: - kfree(filename); fail: + kfree(filename); free_filters_list(filters); kfree(orig); |