diff mbox series

fuse: call pipe_buf_release() under pipe lock

Message ID 20190112013905.9551-1-jannh@google.com (mailing list archive)
State New, archived
Headers show
Series fuse: call pipe_buf_release() under pipe lock | expand

Commit Message

Jann Horn Jan. 12, 2019, 1:39 a.m. UTC
Some of the pipe_buf_release() handlers seem to assume that the pipe is
locked - in particular, anon_pipe_buf_release() accesses pipe->tmp_page
without taking any extra locks. From a glance through the callers of
pipe_buf_release(), it looks like FUSE is the only one that calls
pipe_buf_release() without having the pipe locked.

This bug should only lead to a memory leak, nothing terrible.

Fixes: dd3bb14f44a6 ("fuse: support splice() writing to fuse device")
Cc: stable@vger.kernel.org
Signed-off-by: Jann Horn <jannh@google.com>
---
Warning: I've only found this by inspection, I haven't actually tested
it. If someone familiar with the pipe and splice code (Al Viro? Eric
Biggers?) could comment on this and double-check that this is actually
a real issue, that'd be nice.

Also, if it's a real issue, maybe there should be some more lockdep
checks sprayed across the pipe code...

 fs/fuse/dev.c | 2 ++
 1 file changed, 2 insertions(+)
diff mbox series

Patch

diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
index a5e516a40e7a..ef00a8277824 100644
--- a/fs/fuse/dev.c
+++ b/fs/fuse/dev.c
@@ -2077,8 +2077,10 @@  static ssize_t fuse_dev_splice_write(struct pipe_inode_info *pipe,
 
 	ret = fuse_dev_do_write(fud, &cs, len);
 
+	pipe_lock(pipe);
 	for (idx = 0; idx < nbuf; idx++)
 		pipe_buf_release(pipe, &bufs[idx]);
+	pipe_unlock(pipe);
 
 out:
 	kvfree(bufs);