]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
io_uring: IORING_OP_F[GS]ETXATTR is fine with REQ_F_FIXED_FILE
authorJens Axboe <axboe@kernel.dk>
Mon, 7 Oct 2024 18:20:20 +0000 (12:20 -0600)
committerAl Viro <viro@zeniv.linux.org.uk>
Sun, 20 Oct 2024 00:40:10 +0000 (20:40 -0400)
Rejection of IOSQE_FIXED_FILE combined with IORING_OP_[GS]ETXATTR
is fine - these do not take a file descriptor, so such combination
makes no sense.  The checks are misplaced, though - as it is, they
triggers on IORING_OP_F[GS]ETXATTR as well, and those do take
a file reference, no matter the origin.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
io_uring/xattr.c

index 6cf41c3bc369ecc841907ddb2b4e1d7bbf3d316d..4b68c282c91a43485f482c4c91d7f01603c44a2d 100644 (file)
@@ -48,9 +48,6 @@ static int __io_getxattr_prep(struct io_kiocb *req,
        const char __user *name;
        int ret;
 
-       if (unlikely(req->flags & REQ_F_FIXED_FILE))
-               return -EBADF;
-
        ix->filename = NULL;
        ix->ctx.kvalue = NULL;
        name = u64_to_user_ptr(READ_ONCE(sqe->addr));
@@ -90,6 +87,9 @@ int io_getxattr_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
        const char __user *path;
        int ret;
 
+       if (unlikely(req->flags & REQ_F_FIXED_FILE))
+               return -EBADF;
+
        ret = __io_getxattr_prep(req, sqe);
        if (ret)
                return ret;
@@ -152,9 +152,6 @@ static int __io_setxattr_prep(struct io_kiocb *req,
        const char __user *name;
        int ret;
 
-       if (unlikely(req->flags & REQ_F_FIXED_FILE))
-               return -EBADF;
-
        ix->filename = NULL;
        name = u64_to_user_ptr(READ_ONCE(sqe->addr));
        ix->ctx.cvalue = u64_to_user_ptr(READ_ONCE(sqe->addr2));
@@ -183,6 +180,9 @@ int io_setxattr_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
        const char __user *path;
        int ret;
 
+       if (unlikely(req->flags & REQ_F_FIXED_FILE))
+               return -EBADF;
+
        ret = __io_setxattr_prep(req, sqe);
        if (ret)
                return ret;