Re: [PATCH v7 1/2] fuse: don't BUG when the copy buffer is exhausted

From: Xiang Mei

Date: Thu Sep 10 2026 - 19:55:21 EST


On Thu, Sep 10, 2026 at 10:22 AM Joanne Koong <joannelkoong@xxxxxxxxx> wrote:
>
> On Wed, Sep 9, 2026 at 7:25 PM Xiang Mei <xmei5@xxxxxxx> wrote:
> >
> > fuse_copy_fill() hits BUG_ON(!err) once the iterator backing the copy
> > runs out of pages. Over io-uring the amount copied is not bounded by the
> > payload buffer the server registered, so an unprivileged user can drain
> > the iterator and panic the host - mount a FUSE filesystem with small
> > payload buffers, then setxattr() a larger value:
> >
> > kernel BUG at fs/fuse/dev.c:1064!
> > Oops: invalid opcode: 0000 [#1] SMP KASAN NOPTI
> > CPU: 1 UID: 0 PID: 148 Comm: exploit Not tainted 7.3.0-rc1 #2
> > RIP: 0010:fuse_copy_fill (fs/fuse/dev.c:1033)
> > Call Trace:
> > <TASK>
> > fuse_copy_args (fs/fuse/dev.c:1354 fs/fuse/dev.c:1380)
> > fuse_uring_args_to_ring (fs/fuse/dev_uring.c:891)
> > fuse_uring_prepare_send (fs/fuse/dev_uring.c:940 fs/fuse/dev_uring.c:1057)
> > fuse_uring_send_in_task (fs/fuse/dev_uring.c:1745)
> > tctx_task_work_run (io_uring/tw.c:96)
> > tctx_task_work (io_uring/tw.c:133)
> > task_work_run (kernel/task_work.c:233)
> > io_run_task_work (io_uring/tw.h:84)
> > io_cqring_wait (io_uring/wait.c:278)
> > __do_sys_io_uring_enter (io_uring/io_uring.c:2676)
> > do_syscall_64 (arch/x86/entry/syscall_64.c:61)
> > entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:121)
> > </TASK>
> >
> > The reply path can drain it the same way, via the server-supplied
> > payload_sz in fuse_uring_copy_from_ring().
> >
> > An exhausted iterator is recoverable, so return -EIO. All three
>
> super nit: imo, the reason for returning -EIO is unrelated to an
> iterator being recoverable.

You are right. Also added the comment you suggested on the -EIO mapping.
Both Reviewed-by tags are kept in v8:

https://lore.kernel.org/fuse-devel/20260910235110.3922068-1-xmei5@xxxxxxx/T/#t

Thanks for the reviews, and for steering this to a much simpler fix.
Xiang

>
> > fuse_copy_fill() callers already propagate the error.
> >
> > Fixes: c090c8abae4b ("fuse: Add io-uring sqe commit and fetch support")
> > Cc: stable@xxxxxxxxxxxxxxx
> > Reported-by: Weiming Shi <bestswngs@xxxxxxxxx>
> > Suggested-by: Joanne Koong <joannelkoong@xxxxxxxxx>
> > Assisted-by: Claude:claude-opus-4-8
> > Signed-off-by: Xiang Mei <xmei5@xxxxxxx>
>
> Thanks for your patience with iterating on this fix!
>
> Reviewed-by: Joanne Koong <joannelkoong@xxxxxxxxx>
>
> Thanks,
> Joanne
>
> > ---
> > fs/fuse/dev.c | 3 ++-
> > 1 file changed, 2 insertions(+), 1 deletion(-)
> >
> > diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
> > index 4fec31fc0b84..4148e4488d77 100644
> > --- a/fs/fuse/dev.c
> > +++ b/fs/fuse/dev.c
> > @@ -1061,7 +1061,8 @@ static int fuse_copy_fill(struct fuse_copy_state *cs)
> > err = iov_iter_get_pages2(cs->iter, &page, PAGE_SIZE, 1, &off);
> > if (err < 0)
> > return err;
> > - BUG_ON(!err);
> > + if (!err)
> > + return -EIO;
> > cs->len = err;
> > cs->offset = off;
> > cs->pg = page;
> > --
> > 2.43.0
> >