On Fri, Jun 13, 2025 at 05:01:14PM -0700, Joanne Koong wrote: > This fixes a bug in commit 63c69ad3d18a ("fuse: refactor > fuse_fill_write_pages()") where max_pages << PAGE_SHIFT is mistakenly > used as the calculation for the max_pages upper limit but there's the > possibility that copy_folio_from_iter_atomic() may copy over bytes > from the iov_iter that are less than the full length of the folio, > which would lead to exceeding max_pages. > > This commit fixes it by adding a 'ap->num_folios < max_folios' check. > > Signed-off-by: Joanne Koong <joannelkoong@xxxxxxxxx> > Fixes: 63c69ad3d18a ("fuse: refactor fuse_fill_write_pages()") > Reported-by: Brian Foster <bfoster@xxxxxxxxxx> > Closes: https://lore.kernel.org/linux-fsdevel/aEq4haEQScwHIWK6@bfoster/ > --- This resolves the problem for me as well. Thanks again.. Tested-by: Brian Foster <bfoster@xxxxxxxxxx> > fs/fuse/file.c | 5 ++--- > 1 file changed, 2 insertions(+), 3 deletions(-) > > diff --git a/fs/fuse/file.c b/fs/fuse/file.c > index 3d0b33be3824..a05a589dc701 100644 > --- a/fs/fuse/file.c > +++ b/fs/fuse/file.c > @@ -1147,7 +1147,7 @@ static ssize_t fuse_send_write_pages(struct fuse_io_args *ia, > static ssize_t fuse_fill_write_pages(struct fuse_io_args *ia, > struct address_space *mapping, > struct iov_iter *ii, loff_t pos, > - unsigned int max_pages) > + unsigned int max_folios) > { > struct fuse_args_pages *ap = &ia->ap; > struct fuse_conn *fc = get_fuse_conn(mapping->host); > @@ -1157,12 +1157,11 @@ static ssize_t fuse_fill_write_pages(struct fuse_io_args *ia, > int err = 0; > > num = min(iov_iter_count(ii), fc->max_write); > - num = min(num, max_pages << PAGE_SHIFT); > > ap->args.in_pages = true; > ap->descs[0].offset = offset; > > - while (num) { > + while (num && ap->num_folios < max_folios) { > size_t tmp; > struct folio *folio; > pgoff_t index = pos >> PAGE_SHIFT; > -- > 2.47.1 >