mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-06 18:09:56 +00:00
fuse: don't overflow LLONG_MAX with end offset
[ Upstream commit 2f1398291b ]
Handle the special case of fuse_readpages() wanting to read the last page
of a hugest file possible and overflowing the end offset in the process.
This is basically to unbreak xfstests:generic/525 and prevent filesystems
from doing bad things with an overflowing offset.
Reported-by: Xiao Yang <ice_yangxiao@163.com>
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
2e8420b46f
commit
f5654d8dba
@@ -803,6 +803,10 @@ static int fuse_do_readpage(struct file *file, struct page *page)
|
|||||||
|
|
||||||
attr_ver = fuse_get_attr_version(fc);
|
attr_ver = fuse_get_attr_version(fc);
|
||||||
|
|
||||||
|
/* Don't overflow end offset */
|
||||||
|
if (pos + (desc.length - 1) == LLONG_MAX)
|
||||||
|
desc.length--;
|
||||||
|
|
||||||
fuse_read_args_fill(&ia, file, pos, desc.length, FUSE_READ);
|
fuse_read_args_fill(&ia, file, pos, desc.length, FUSE_READ);
|
||||||
res = fuse_simple_request(fc, &ia.ap.args);
|
res = fuse_simple_request(fc, &ia.ap.args);
|
||||||
if (res < 0)
|
if (res < 0)
|
||||||
@@ -888,6 +892,14 @@ static void fuse_send_readpages(struct fuse_io_args *ia, struct file *file)
|
|||||||
ap->args.out_pages = true;
|
ap->args.out_pages = true;
|
||||||
ap->args.page_zeroing = true;
|
ap->args.page_zeroing = true;
|
||||||
ap->args.page_replace = true;
|
ap->args.page_replace = true;
|
||||||
|
|
||||||
|
/* Don't overflow end offset */
|
||||||
|
if (pos + (count - 1) == LLONG_MAX) {
|
||||||
|
count--;
|
||||||
|
ap->descs[ap->num_pages - 1].length--;
|
||||||
|
}
|
||||||
|
WARN_ON((loff_t) (pos + count) < 0);
|
||||||
|
|
||||||
fuse_read_args_fill(ia, file, pos, count, FUSE_READ);
|
fuse_read_args_fill(ia, file, pos, count, FUSE_READ);
|
||||||
ia->read.attr_ver = fuse_get_attr_version(fc);
|
ia->read.attr_ver = fuse_get_attr_version(fc);
|
||||||
if (fc->async_read) {
|
if (fc->async_read) {
|
||||||
|
|||||||
Reference in New Issue
Block a user