aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorJens Axboe <axboe@kernel.dk>2020-09-18 19:36:24 -0600
committerJens Axboe <axboe@kernel.dk>2020-09-21 07:51:03 -0600
commit4eb8dded6b82e184c09bb963bea0335fa3f30b55 (patch)
tree61a853fa6802fe118eb6856f8a97a241bb53851e
parentio_uring: mark statx/files_update/epoll_ctl as non-SQPOLL (diff)
downloadwireguard-linux-4eb8dded6b82e184c09bb963bea0335fa3f30b55.tar.xz
wireguard-linux-4eb8dded6b82e184c09bb963bea0335fa3f30b55.zip
io_uring: fix openat/openat2 unified prep handling
A previous commit unified how we handle prep for these two functions, but this means that we check the allowed context (SQPOLL, specifically) later than we should. Move the ring type checking into the two parent functions, instead of doing it after we've done some setup work. Fixes: ec65fea5a8d7 ("io_uring: deduplicate io_openat{,2}_prep()") Reported-by: Andy Lutomirski <luto@kernel.org> Signed-off-by: Jens Axboe <axboe@kernel.dk>
-rw-r--r--fs/io_uring.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/fs/io_uring.c b/fs/io_uring.c
index f2b180731676..e6004b92e553 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -3527,8 +3527,6 @@ static int __io_openat_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe
const char __user *fname;
int ret;
- if (unlikely(req->ctx->flags & (IORING_SETUP_IOPOLL|IORING_SETUP_SQPOLL)))
- return -EINVAL;
if (unlikely(sqe->ioprio || sqe->buf_index))
return -EINVAL;
if (unlikely(req->flags & REQ_F_FIXED_FILE))
@@ -3555,6 +3553,8 @@ static int io_openat_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
{
u64 flags, mode;
+ if (unlikely(req->ctx->flags & (IORING_SETUP_IOPOLL|IORING_SETUP_SQPOLL)))
+ return -EINVAL;
if (req->flags & REQ_F_NEED_CLEANUP)
return 0;
mode = READ_ONCE(sqe->len);
@@ -3569,6 +3569,8 @@ static int io_openat2_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
size_t len;
int ret;
+ if (unlikely(req->ctx->flags & (IORING_SETUP_IOPOLL|IORING_SETUP_SQPOLL)))
+ return -EINVAL;
if (req->flags & REQ_F_NEED_CLEANUP)
return 0;
how = u64_to_user_ptr(READ_ONCE(sqe->addr2));