io_uring: don't check file ops of registered rings
authorPavel Begunkov <asml.silence@gmail.com>
Sat, 25 Jun 2022 10:53:01 +0000 (11:53 +0100)
committerJens Axboe <axboe@kernel.dk>
Mon, 25 Jul 2022 00:39:16 +0000 (18:39 -0600)
Registered rings are per definitions io_uring files, so we don't need to
additionally verify them.

Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/425cd64fd885b8e329a46c205ee811987691baaf.1656153286.git.asml.silence@gmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_uring/io_uring.c

index f405264..e1e8dcd 100644 (file)
@@ -3036,22 +3036,22 @@ SYSCALL_DEFINE6(io_uring_enter, unsigned int, fd, u32, to_submit,
        if (flags & IORING_ENTER_REGISTERED_RING) {
                struct io_uring_task *tctx = current->io_uring;
 
-               if (!tctx || fd >= IO_RINGFD_REG_MAX)
+               if (unlikely(!tctx || fd >= IO_RINGFD_REG_MAX))
                        return -EINVAL;
                fd = array_index_nospec(fd, IO_RINGFD_REG_MAX);
                f.file = tctx->registered_rings[fd];
                f.flags = 0;
+               if (unlikely(!f.file))
+                       return -EBADF;
        } else {
                f = fdget(fd);
+               if (unlikely(!f.file))
+                       return -EBADF;
+               ret = -EOPNOTSUPP;
+               if (unlikely(!io_is_uring_fops(f.file)))
+                       goto out_fput;
        }
 
-       if (unlikely(!f.file))
-               return -EBADF;
-
-       ret = -EOPNOTSUPP;
-       if (unlikely(!io_is_uring_fops(f.file)))
-               goto out_fput;
-
        ret = -ENXIO;
        ctx = f.file->private_data;
        if (unlikely(!percpu_ref_tryget(&ctx->refs)))