Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 48706d0a authored by Miklos Szeredi's avatar Miklos Szeredi
Browse files

fuse: fix fuse_retrieve



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: default avatarMiklos Szeredi <mszeredi@suse.cz>
CC: stable@vger.kernel.org
parent dc47ce90
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -1512,7 +1512,7 @@ static int fuse_retrieve(struct fuse_conn *fc, struct inode *inode,
	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_conn *fc, struct inode *inode,

		num -= this_num;
		total_len += this_num;
		index++;
	}
	req->misc.retrieve_in.offset = outarg->offset;
	req->misc.retrieve_in.size = total_len;