summaryrefslogtreecommitdiff
path: root/io_uring
diff options
context:
space:
mode:
authorPenglei Jiang <superman.xpt@gmail.com>2025-06-17 09:56:44 -0700
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2025-07-06 11:01:47 +0200
commit8b8a366e8cb266883bf794b9efc0513c3c356d04 (patch)
tree8b4f2465dfd1af4cf86ba6c1c09866f78f21e9f0 /io_uring
parent6d56ea133adf0389b216ba6e47f7f35e95776713 (diff)
io_uring: fix potential page leak in io_sqe_buffer_register()
Commit e1c75831f682eef0f68b35723437146ed86070b1 upstream. 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> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'io_uring')
-rw-r--r--io_uring/rsrc.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/io_uring/rsrc.c b/io_uring/rsrc.c
index a67bae350416..9983b940eb57 100644
--- a/io_uring/rsrc.c
+++ b/io_uring/rsrc.c
@@ -983,10 +983,8 @@ static int io_sqe_buffer_register(struct io_ring_ctx *ctx, struct iovec *iov,
goto done;
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 */
@@ -1010,8 +1008,11 @@ static int io_sqe_buffer_register(struct io_ring_ctx *ctx, struct iovec *iov,
size -= vec_len;
}
done:
- if (ret)
+ if (ret) {
kvfree(imu);
+ if (pages)
+ unpin_user_pages(pages, nr_pages);
+ }
kvfree(pages);
return ret;
}