io_uring: io_allocate_scq_urings() should return a sane state
authorJens Axboe <axboe@kernel.dk>
Wed, 20 Nov 2019 16:26:29 +0000 (09:26 -0700)
committerJens Axboe <axboe@kernel.dk>
Tue, 26 Nov 2019 02:56:06 +0000 (19:56 -0700)
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>
fs/io_uring.c

index 6d52a4d643e679f2180bc019e52d737a4b2bb835..55bc890f863d5e70404edf6806efdcab30664b9e 100644 (file)
@@ -4583,12 +4583,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;
 }