summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPavel Begunkov <asml.silence@gmail.com>2025-07-21 10:56:22 +0100
committerJens Axboe <axboe@kernel.dk>2025-07-21 06:47:45 -0600
commitd9f595b9a65e9c9eb03e21f3db98fde158d128db (patch)
tree85172b0bc0034db189ac5d66a1c7c2cbdc3a8445
parent6bbd3411ff87df1ca38ff32d36eb5dc673ca8021 (diff)
io_uring/zcrx: fix leaking pages on sg init fail
If sg_alloc_table_from_pages() fails, io_import_umem() returns without cleaning up pinned pages first. Fix it. Fixes: b84621d96ee02 ("io_uring/zcrx: allocate sgtable for umem areas") Signed-off-by: Pavel Begunkov <asml.silence@gmail.com> Link: https://lore.kernel.org/r/9fd94d1bc8c316611eccfec7579799182ff3fb0a.1753091564.git.asml.silence@gmail.com Signed-off-by: Jens Axboe <axboe@kernel.dk>
-rw-r--r--io_uring/zcrx.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/io_uring/zcrx.c b/io_uring/zcrx.c
index 6a983f1ab592..2d8bc4219463 100644
--- a/io_uring/zcrx.c
+++ b/io_uring/zcrx.c
@@ -194,8 +194,10 @@ static int io_import_umem(struct io_zcrx_ifq *ifq,
ret = sg_alloc_table_from_pages(&mem->page_sg_table, pages, nr_pages,
0, nr_pages << PAGE_SHIFT,
GFP_KERNEL_ACCOUNT);
- if (ret)
+ if (ret) {
+ unpin_user_pages(pages, nr_pages);
return ret;
+ }
mem->account_pages = io_count_account_pages(pages, nr_pages);
ret = io_account_mem(ifq->ctx, mem->account_pages);