io_uring: don't touch ctx in setup after ring fd install
syzkaller reported an issue where it looks like a malicious app can
trigger a use-after-free of reading the ctx ->sq_array and ->rings
value right after having installed the ring fd in the process file
table.
Defer ring fd installation until after we're done reading those
values.
Fixes: 75b28affdd
("io_uring: allocate the two rings together")
Reported-by: syzbot+6f03d895a6cd0d06187f@syzkaller.appspotmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
7b20238d28
commit
044c1ab399
@ -3829,10 +3829,6 @@ static int io_uring_create(unsigned entries, struct io_uring_params *p)
|
|||||||
if (ret)
|
if (ret)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
ret = io_uring_get_fd(ctx);
|
|
||||||
if (ret < 0)
|
|
||||||
goto err;
|
|
||||||
|
|
||||||
memset(&p->sq_off, 0, sizeof(p->sq_off));
|
memset(&p->sq_off, 0, sizeof(p->sq_off));
|
||||||
p->sq_off.head = offsetof(struct io_rings, sq.head);
|
p->sq_off.head = offsetof(struct io_rings, sq.head);
|
||||||
p->sq_off.tail = offsetof(struct io_rings, sq.tail);
|
p->sq_off.tail = offsetof(struct io_rings, sq.tail);
|
||||||
@ -3850,6 +3846,14 @@ static int io_uring_create(unsigned entries, struct io_uring_params *p)
|
|||||||
p->cq_off.overflow = offsetof(struct io_rings, cq_overflow);
|
p->cq_off.overflow = offsetof(struct io_rings, cq_overflow);
|
||||||
p->cq_off.cqes = offsetof(struct io_rings, cqes);
|
p->cq_off.cqes = offsetof(struct io_rings, cqes);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Install ring fd as the very last thing, so we don't risk someone
|
||||||
|
* having closed it before we finish setup
|
||||||
|
*/
|
||||||
|
ret = io_uring_get_fd(ctx);
|
||||||
|
if (ret < 0)
|
||||||
|
goto err;
|
||||||
|
|
||||||
p->features = IORING_FEAT_SINGLE_MMAP;
|
p->features = IORING_FEAT_SINGLE_MMAP;
|
||||||
return ret;
|
return ret;
|
||||||
err:
|
err:
|
||||||
|
Loading…
Reference in New Issue
Block a user