linux-stable/fs/fuse
Miklos Szeredi 729bcb4c92 fuse: fix page stealing
commit 712a951025 upstream.

It is possible to trigger a crash by splicing anon pipe bufs to the fuse
device.

The reason for this is that anon_pipe_buf_release() will reuse buf->page if
the refcount is 1, but that page might have already been stolen and its
flags modified (e.g. PG_lru added).

This happens in the unlikely case of fuse_dev_splice_write() getting around
to calling pipe_buf_release() after a page has been stolen, added to the
page cache and removed from the page cache.

Fix by calling pipe_buf_release() right after the page was inserted into
the page cache.  In this case the page has an elevated refcount so any
release function will know that the page isn't reusable.

Reported-by: Frank Dinoff <fdinoff@google.com>
Link: https://lore.kernel.org/r/CAAmZXrsGg2xsP1CK+cbuEMumtrqdvD-NKnWzhNcvn71RV3c1yw@mail.gmail.com/
Fixes: dd3bb14f44 ("fuse: support splice() writing to fuse device")
Cc: <stable@vger.kernel.org> # v2.6.35
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2021-11-18 19:15:56 +01:00
..
acl.c vfs: add rcu argument to ->get_acl() callback 2021-08-18 22:08:24 +02:00
control.c fuse: name fs_context consistently 2021-08-04 13:22:58 +02:00
cuse.c cuse: simplify refcount 2021-04-14 10:40:58 +02:00
dax.c \n 2021-08-30 10:24:50 -07:00
dev.c fuse: fix page stealing 2021-11-18 19:15:56 +01:00
dir.c fuse: Convert to using invalidate_lock 2021-07-13 14:29:01 +02:00
file.c fuse update for 5.15 2021-09-07 12:18:29 -07:00
fuse_i.h fuse: get rid of fuse_put_super() 2021-10-21 10:01:38 +02:00
inode.c fuse: clean up error exits in fuse_fill_super() 2021-10-21 10:01:39 +02:00
ioctl.c fuse: convert to fileattr 2021-04-12 15:04:30 +02:00
Kconfig virtiofs: implement dax read/write operations 2020-09-10 11:39:23 +02:00
Makefile fuse: move ioctl to separate source file 2021-04-12 15:04:30 +02:00
readdir.c fuse: fix illegal access to inode with reused nodeid 2021-06-22 09:15:36 +02:00
virtio_fs.c fuse: clean up fuse_mount destruction 2021-10-21 10:01:39 +02:00
xattr.c fuse: extend FUSE_SETXATTR request 2021-04-14 10:40:57 +02:00