Re: [PATCH] fuse: fix fuse_fill_write_pages() upper bound calculation

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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
> 





[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [NTFS 3]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [NTFS 3]     [Samba]     [Device Mapper]     [CEPH Development]

  Powered by Linux