FAILED: patch "[PATCH] fuse: fix page stealing" failed to apply to 4.4-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 4.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 712a951025c0667ff00b25afc360f74e639dfabe Mon Sep 17 00:00:00 2001
From: Miklos Szeredi <[email protected]>
Date: Tue, 2 Nov 2021 11:10:37 +0100
Subject: [PATCH] fuse: fix page stealing
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.
fs/fuse/dev.c +12 -2
@@ -847,6 +847,12 @@ static int fuse_try_move_page(struct fuse_copy_state *cs, struct page **pagep)replace_page_cache_page (oldpage, newpage); +/* +* Release while we have extra ref on stolen page. Otherwise +* anon_pipe_buf_release() might think the page can be reused. +*/ +pipe_buf_release (cs->pipe, buf); +get_page (newpage);if (!(buf->flags &PIPE_BUF_FLAG_LRU ))
@@ -2031,8 +2037,12 @@ static ssize_t fuse_dev_splice_write(struct pipe_inode_info *pipe,pipe_lock (pipe); out_free: -for (idx =0 ; idx < nbuf; idx++) -pipe_buf_release (pipe, &bufs[idx]); +for (idx =0 ; idx < nbuf; idx++) { +struct pipe_buffer *buf = &bufs[idx]; + +if (buf->ops) +pipe_buf_release (pipe, buf); + }pipe_unlock (pipe);kvfree (bufs);
Quoted 7 lines · On Sat, Nov 13, 2021 at 2:14 PM <[email protected]> wrote:
The patch below does not apply to the 4.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
Hi Greg,
Attaching tested backport of 712a951025c0 ("fuse: fix page stealing") to v4.4.292.
Thanks,
Miklos
From 24e099c8a47c61cfd849715dc5074c6aecd3233d Mon Sep 17 00:00:00 2001
From: Miklos Szeredi <[email protected]>
Date: Tue, 2 Nov 2021 11:10:37 +0100
Subject: [PATCH] fuse: fix page stealing
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.
--- fs/fuse/dev.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
fs/fuse/dev.c +9 -1
@@ -922,6 +922,13 @@ static int fuse_try_move_page(struct fuse_copy_state *cs, struct page **pagep)return err; } +/* +* Release while we have extra ref on stolen page. Otherwise +* anon_pipe_buf_release() might think the page can be reused. +*/ + buf->ops->release (cs->pipe, buf); + buf->ops =NULL ; +page_cache_get (newpage);if (!(buf->flags &PIPE_BUF_FLAG_LRU ))
@@ -2090,7 +2097,8 @@ static ssize_t fuse_dev_splice_write(struct pipe_inode_info *pipe, out_free:for (idx =0 ; idx < nbuf; idx++) {struct pipe_buffer *buf = &bufs[idx]; - buf->ops->release (pipe, buf); +if (buf->ops) + buf->ops->release (pipe, buf); }pipe_unlock (pipe);
Signature · 1 line
2.31.1
Greg Kroah-Hartman
maintainerQuoted 9 lines · Miklos Szeredi
Quoted 7 lines · On Sat, Nov 13, 2021 at 2:14 PM <[email protected]> wrote:
The patch below does not apply to the 4.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
Quoted 4 lines
Hi Greg,
Attaching tested backport of
712a951025c0("fuse: fix page stealing") to v4.4.292.
Now queued up, thanks!
greg k-h