]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
io_uring: fix potential page leak in io_sqe_buffer_register()
authorPenglei Jiang <superman.xpt@gmail.com>
Tue, 17 Jun 2025 16:56:44 +0000 (09:56 -0700)
committerJens Axboe <axboe@kernel.dk>
Wed, 18 Jun 2025 11:09:46 +0000 (05:09 -0600)
If allocation of the 'imu' fails, then the existing pages aren't
unpinned in the error path. This is mostly a theoretical issue,
requiring fault injection to hit.

Move unpin_user_pages() to unified error handling to fix the page leak
issue.

Fixes: d8c2237d0aa9 ("io_uring: add io_pin_pages() helper")
Signed-off-by: Penglei Jiang <superman.xpt@gmail.com>
Link: https://lore.kernel.org/r/20250617165644.79165-1-superman.xpt@gmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_uring/rsrc.c

index 94a9db030e0e5f89c4b80b5ea1436d970c2d68c9..d724602697e7cfdf0229718d7be8874bf135c15d 100644 (file)
@@ -809,10 +809,8 @@ static struct io_rsrc_node *io_sqe_buffer_register(struct io_ring_ctx *ctx,
 
        imu->nr_bvecs = nr_pages;
        ret = io_buffer_account_pin(ctx, pages, nr_pages, imu, last_hpage);
-       if (ret) {
-               unpin_user_pages(pages, nr_pages);
+       if (ret)
                goto done;
-       }
 
        size = iov->iov_len;
        /* store original address for later verification */
@@ -842,6 +840,8 @@ done:
        if (ret) {
                if (imu)
                        io_free_imu(ctx, imu);
+               if (pages)
+                       unpin_user_pages(pages, nr_pages);
                io_cache_free(&ctx->node_cache, node);
                node = ERR_PTR(ret);
        }