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: d8c2237d0a ("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>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
6d56ea133a
commit
8b8a366e8c
+5
-4
@@ -983,10 +983,8 @@ static int io_sqe_buffer_register(struct io_ring_ctx *ctx, struct iovec *iov,
|
|||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
ret = io_buffer_account_pin(ctx, pages, nr_pages, imu, last_hpage);
|
ret = io_buffer_account_pin(ctx, pages, nr_pages, imu, last_hpage);
|
||||||
if (ret) {
|
if (ret)
|
||||||
unpin_user_pages(pages, nr_pages);
|
|
||||||
goto done;
|
goto done;
|
||||||
}
|
|
||||||
|
|
||||||
size = iov->iov_len;
|
size = iov->iov_len;
|
||||||
/* store original address for later verification */
|
/* 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;
|
size -= vec_len;
|
||||||
}
|
}
|
||||||
done:
|
done:
|
||||||
if (ret)
|
if (ret) {
|
||||||
kvfree(imu);
|
kvfree(imu);
|
||||||
|
if (pages)
|
||||||
|
unpin_user_pages(pages, nr_pages);
|
||||||
|
}
|
||||||
kvfree(pages);
|
kvfree(pages);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user