io_uring: io_allocate_scq_urings() should return a sane state
We currently rely on the ring destroy on cleaning things up in case of failure, but io_allocate_scq_urings() can leave things half initialized if only parts of it fails. Be nice and return with either everything setup in success, or return an error with things nicely cleaned up. Reported-by: syzbot+0d818c0d39399188f393@syzkaller.appspotmail.com Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
bbad27b2f6
commit
eb065d301e
|
@ -4583,12 +4583,18 @@ static int io_allocate_scq_urings(struct io_ring_ctx *ctx,
|
||||||
ctx->cq_entries = rings->cq_ring_entries;
|
ctx->cq_entries = rings->cq_ring_entries;
|
||||||
|
|
||||||
size = array_size(sizeof(struct io_uring_sqe), p->sq_entries);
|
size = array_size(sizeof(struct io_uring_sqe), p->sq_entries);
|
||||||
if (size == SIZE_MAX)
|
if (size == SIZE_MAX) {
|
||||||
|
io_mem_free(ctx->rings);
|
||||||
|
ctx->rings = NULL;
|
||||||
return -EOVERFLOW;
|
return -EOVERFLOW;
|
||||||
|
}
|
||||||
|
|
||||||
ctx->sq_sqes = io_mem_alloc(size);
|
ctx->sq_sqes = io_mem_alloc(size);
|
||||||
if (!ctx->sq_sqes)
|
if (!ctx->sq_sqes) {
|
||||||
|
io_mem_free(ctx->rings);
|
||||||
|
ctx->rings = NULL;
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue