| From 6ffd304344f8c1b320021b637cc0d8d05e606286 Mon Sep 17 00:00:00 2001 |
| From: "Steven Rostedt (VMware)" <rostedt@goodmis.org> |
| Date: Fri, 11 Oct 2019 18:19:17 -0400 |
| Subject: [PATCH] tracing: Get trace_array reference for available_tracers |
| files |
| |
| commit 194c2c74f5532e62c218adeb8e2b683119503907 upstream. |
| |
| As instances may have different tracers available, we need to look at the |
| trace_array descriptor that shows the list of the available tracers for the |
| instance. But there's a race between opening the file and an admin |
| deleting the instance. The trace_array_get() needs to be called before |
| accessing the trace_array. |
| |
| Cc: stable@vger.kernel.org |
| Fixes: 607e2ea167e56 ("tracing: Set up infrastructure to allow tracers for instances") |
| Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c |
| index c3aabb576fe5..1a65ca0a91f6 100644 |
| --- a/kernel/trace/trace.c |
| +++ b/kernel/trace/trace.c |
| @@ -4353,9 +4353,14 @@ static int show_traces_open(struct inode *inode, struct file *file) |
| if (tracing_disabled) |
| return -ENODEV; |
| |
| + if (trace_array_get(tr) < 0) |
| + return -ENODEV; |
| + |
| ret = seq_open(file, &show_traces_seq_ops); |
| - if (ret) |
| + if (ret) { |
| + trace_array_put(tr); |
| return ret; |
| + } |
| |
| m = file->private_data; |
| m->private = tr; |
| @@ -4363,6 +4368,14 @@ static int show_traces_open(struct inode *inode, struct file *file) |
| return 0; |
| } |
| |
| +static int show_traces_release(struct inode *inode, struct file *file) |
| +{ |
| + struct trace_array *tr = inode->i_private; |
| + |
| + trace_array_put(tr); |
| + return seq_release(inode, file); |
| +} |
| + |
| static ssize_t |
| tracing_write_stub(struct file *filp, const char __user *ubuf, |
| size_t count, loff_t *ppos) |
| @@ -4393,8 +4406,8 @@ static const struct file_operations tracing_fops = { |
| static const struct file_operations show_traces_fops = { |
| .open = show_traces_open, |
| .read = seq_read, |
| - .release = seq_release, |
| .llseek = seq_lseek, |
| + .release = show_traces_release, |
| }; |
| |
| static ssize_t |
| -- |
| 2.7.4 |
| |