From 4e56986ff3d52d34136f32361c2fb97e28703891 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Wed, 20 Nov 2019 09:26:29 -0700 Subject: [PATCH 1037/2944] io_uring: io_allocate_scq_urings() should return a sane state to #26323578 commit eb065d301e8c83643367bdb0898becc364046bda upstream. 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 Signed-off-by: Joseph Qi Acked-by: Xiaoguang Wang --- fs/io_uring.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/fs/io_uring.c b/fs/io_uring.c index e0459e4..14791a2 100644 --- a/fs/io_uring.c +++ b/fs/io_uring.c @@ -4593,12 +4593,18 @@ static int io_allocate_scq_urings(struct io_ring_ctx *ctx, ctx->cq_entries = rings->cq_ring_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; + } 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 0; } -- 1.8.3.1