]> git.hungrycats.org Git - linux/commitdiff
fix memory leaks in tracing_buffers_splice_read()
authorAl Viro <viro@zeniv.linux.org.uk>
Sat, 17 Sep 2016 22:31:46 +0000 (18:31 -0400)
committerJiri Slaby <jslaby@suse.cz>
Thu, 6 Oct 2016 06:21:56 +0000 (08:21 +0200)
commit 1ae2293dd6d2f5c823cf97e60b70d03631cd622f upstream.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
kernel/trace/trace.c

index 12cff54899eec378284b0909ea11bfe642b21414..140f4d6e6caa2b2b943a4666dd0144dcfdd7d059 100644 (file)
@@ -5179,11 +5179,6 @@ tracing_buffers_splice_read(struct file *file, loff_t *ppos,
        }
 #endif
 
-       if (splice_grow_spd(pipe, &spd)) {
-               ret = -ENOMEM;
-               goto out;
-       }
-
        if (*ppos & (PAGE_SIZE - 1)) {
                ret = -EINVAL;
                goto out;
@@ -5197,6 +5192,11 @@ tracing_buffers_splice_read(struct file *file, loff_t *ppos,
                len &= PAGE_MASK;
        }
 
+       if (splice_grow_spd(pipe, &spd)) {
+               ret = -ENOMEM;
+               goto out;
+       }
+
  again:
        trace_access_lock(iter->cpu_file);
        entries = ring_buffer_entries_cpu(iter->trace_buffer->buffer, iter->cpu_file);
@@ -5252,21 +5252,22 @@ tracing_buffers_splice_read(struct file *file, loff_t *ppos,
        if (!spd.nr_pages) {
                if ((file->f_flags & O_NONBLOCK) || (flags & SPLICE_F_NONBLOCK)) {
                        ret = -EAGAIN;
-                       goto out;
+                       goto out_shrink;
                }
                mutex_unlock(&trace_types_lock);
                ret = iter->trace->wait_pipe(iter);
                mutex_lock(&trace_types_lock);
                if (ret)
-                       goto out;
+                       goto out_shrink;
                if (signal_pending(current)) {
                        ret = -EINTR;
-                       goto out;
+                       goto out_shrink;
                }
                goto again;
        }
 
        ret = splice_to_pipe(pipe, &spd);
+out_shrink:
        splice_shrink_spd(&spd);
 out:
        mutex_unlock(&trace_types_lock);