mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-03-22 07:27:12 +08:00
fuse: missing copy_finish in fuse-over-io-uring argument copies
Fix a possible reference count leak of payload pages during
fuse argument copies.
[Joanne: simplified error cleanup]
Fixes: c090c8abae ("fuse: Add io-uring sqe commit and fetch support")
Cc: stable@vger.kernel.org # v6.14
Signed-off-by: Cheng Ding <cding@ddn.com>
Signed-off-by: Bernd Schubert <bschubert@ddn.com>
Reviewed-by: Joanne Koong <joannelkoong@gmail.com>
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
This commit is contained in:
committed by
Miklos Szeredi
parent
bd5603eaae
commit
6e0d7f7f4a
@@ -846,7 +846,7 @@ void fuse_copy_init(struct fuse_copy_state *cs, bool write,
|
||||
}
|
||||
|
||||
/* Unmap and put previous page of userspace buffer */
|
||||
static void fuse_copy_finish(struct fuse_copy_state *cs)
|
||||
void fuse_copy_finish(struct fuse_copy_state *cs)
|
||||
{
|
||||
if (cs->currbuf) {
|
||||
struct pipe_buffer *buf = cs->currbuf;
|
||||
|
||||
@@ -598,7 +598,9 @@ static int fuse_uring_copy_from_ring(struct fuse_ring *ring,
|
||||
cs.is_uring = true;
|
||||
cs.req = req;
|
||||
|
||||
return fuse_copy_out_args(&cs, args, ring_in_out.payload_sz);
|
||||
err = fuse_copy_out_args(&cs, args, ring_in_out.payload_sz);
|
||||
fuse_copy_finish(&cs);
|
||||
return err;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -649,6 +651,7 @@ static int fuse_uring_args_to_ring(struct fuse_ring *ring, struct fuse_req *req,
|
||||
/* copy the payload */
|
||||
err = fuse_copy_args(&cs, num_args, args->in_pages,
|
||||
(struct fuse_arg *)in_args, 0);
|
||||
fuse_copy_finish(&cs);
|
||||
if (err) {
|
||||
pr_info_ratelimited("%s fuse_copy_args failed\n", __func__);
|
||||
return err;
|
||||
|
||||
@@ -62,6 +62,7 @@ void fuse_dev_end_requests(struct list_head *head);
|
||||
|
||||
void fuse_copy_init(struct fuse_copy_state *cs, bool write,
|
||||
struct iov_iter *iter);
|
||||
void fuse_copy_finish(struct fuse_copy_state *cs);
|
||||
int fuse_copy_args(struct fuse_copy_state *cs, unsigned int numargs,
|
||||
unsigned int argpages, struct fuse_arg *args,
|
||||
int zeroing);
|
||||
|
||||
Reference in New Issue
Block a user