]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
io_uring/msg_ring: don't leave potentially dangling ->tctx pointer
authorJens Axboe <axboe@kernel.dk>
Thu, 23 Jan 2025 00:03:28 +0000 (17:03 -0700)
committerJens Axboe <axboe@kernel.dk>
Thu, 23 Jan 2025 00:10:45 +0000 (17:10 -0700)
For remote posting of messages, req->tctx is assigned even though it
is never used. Rather than leave a dangling pointer, just clear it to
NULL and use the previous check for a valid submitter_task to gate on
whether or not the request should be terminated.

Reported-by: Jann Horn <jannh@google.com>
Fixes: b6f58a3f4aa8 ("io_uring: move struct io_kiocb from task_struct to io_uring_task")
Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_uring/msg_ring.c

index bd3cd78d2dba396bd2d3246ef16746f2fc8117c3..7e6f68e911f10cdec35cc8b0ca49e569fbdd7856 100644 (file)
@@ -89,8 +89,7 @@ static void io_msg_tw_complete(struct io_kiocb *req, struct io_tw_state *ts)
 static int io_msg_remote_post(struct io_ring_ctx *ctx, struct io_kiocb *req,
                              int res, u32 cflags, u64 user_data)
 {
-       req->tctx = READ_ONCE(ctx->submitter_task->io_uring);
-       if (!req->tctx) {
+       if (!READ_ONCE(ctx->submitter_task)) {
                kmem_cache_free(req_cachep, req);
                return -EOWNERDEAD;
        }
@@ -98,6 +97,7 @@ static int io_msg_remote_post(struct io_ring_ctx *ctx, struct io_kiocb *req,
        io_req_set_res(req, res, cflags);
        percpu_ref_get(&ctx->refs);
        req->ctx = ctx;
+       req->tctx = NULL;
        req->io_task_work.func = io_msg_tw_complete;
        io_req_task_work_add_remote(req, ctx, IOU_F_TWQ_LAZY_WAKE);
        return 0;