[39/45] fuse: fix fuse_retrieve
From: Greg KH <gregkh@suse.de>
Date: 2011-12-16 19:56:08
Also in:
lkml
3.0-stable review patch. If anyone has any objections, please let me know. ------------------ From: Miklos Szeredi <redacted> commit 48706d0a91583d08c56e7ef2a7602d99c8d4133f upstream. Fix two bugs in fuse_retrieve(): - retrieving more than one page would yield repeated instances of the first page - if more than FUSE_MAX_PAGES_PER_REQ pages were requested than the request page array would overflow fuse_retrieve() was added in 2.6.36 and these bugs had been there since the beginning. Signed-off-by: Miklos Szeredi <redacted> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> --- fs/fuse/dev.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
--- a/fs/fuse/dev.c
+++ b/fs/fuse/dev.c@@ -1512,7 +1512,7 @@ static int fuse_retrieve(struct fuse_con else if (outarg->offset + num > file_size) num = file_size - outarg->offset; - while (num) { + while (num && req->num_pages < FUSE_MAX_PAGES_PER_REQ) { struct page *page; unsigned int this_num;
@@ -1526,6 +1526,7 @@ static int fuse_retrieve(struct fuse_con num -= this_num; total_len += this_num; + index++; } req->misc.retrieve_in.offset = outarg->offset; req->misc.retrieve_in.size = total_len;