Skip to content

Commit

Permalink
io_uring: make io_kiocb_to_cmd() typesafe
Browse files Browse the repository at this point in the history
We need to make sure (at build time) that struct io_cmd_data is not
casted to a structure that's larger.

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Link: https://lore.kernel.org/r/c024cdf25ae19fc0319d4180e2298bade8ed17b8.1660201408.git.metze@samba.org
Signed-off-by: Jens Axboe <axboe@kernel.dk>
  • Loading branch information
metze-samba authored and axboe committed Aug 12, 2022
1 parent addebd9 commit f2ccb5a
Show file tree
Hide file tree
Showing 20 changed files with 134 additions and 129 deletions.
9 changes: 8 additions & 1 deletion include/linux/io_uring_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -491,7 +491,14 @@ struct io_cmd_data {
__u8 data[56];
};

#define io_kiocb_to_cmd(req) ((void *) &(req)->cmd)
static inline void io_kiocb_cmd_sz_check(size_t cmd_sz)
{
BUILD_BUG_ON(cmd_sz > sizeof(struct io_cmd_data));
}
#define io_kiocb_to_cmd(req, cmd_type) ( \
io_kiocb_cmd_sz_check(sizeof(cmd_type)) , \
((cmd_type *)&(req)->cmd) \
)
#define cmd_to_io_kiocb(ptr) ((struct io_kiocb *) ptr)

struct io_kiocb {
Expand Down
8 changes: 4 additions & 4 deletions io_uring/advise.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ struct io_madvise {
int io_madvise_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
{
#if defined(CONFIG_ADVISE_SYSCALLS) && defined(CONFIG_MMU)
struct io_madvise *ma = io_kiocb_to_cmd(req);
struct io_madvise *ma = io_kiocb_to_cmd(req, struct io_madvise);

if (sqe->buf_index || sqe->off || sqe->splice_fd_in)
return -EINVAL;
Expand All @@ -48,7 +48,7 @@ int io_madvise_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
int io_madvise(struct io_kiocb *req, unsigned int issue_flags)
{
#if defined(CONFIG_ADVISE_SYSCALLS) && defined(CONFIG_MMU)
struct io_madvise *ma = io_kiocb_to_cmd(req);
struct io_madvise *ma = io_kiocb_to_cmd(req, struct io_madvise);
int ret;

if (issue_flags & IO_URING_F_NONBLOCK)
Expand All @@ -64,7 +64,7 @@ int io_madvise(struct io_kiocb *req, unsigned int issue_flags)

int io_fadvise_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
{
struct io_fadvise *fa = io_kiocb_to_cmd(req);
struct io_fadvise *fa = io_kiocb_to_cmd(req, struct io_fadvise);

if (sqe->buf_index || sqe->addr || sqe->splice_fd_in)
return -EINVAL;
Expand All @@ -77,7 +77,7 @@ int io_fadvise_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)

int io_fadvise(struct io_kiocb *req, unsigned int issue_flags)
{
struct io_fadvise *fa = io_kiocb_to_cmd(req);
struct io_fadvise *fa = io_kiocb_to_cmd(req, struct io_fadvise);
int ret;

if (issue_flags & IO_URING_F_NONBLOCK) {
Expand Down
4 changes: 2 additions & 2 deletions io_uring/cancel.c
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ int io_try_cancel(struct io_uring_task *tctx, struct io_cancel_data *cd,

int io_async_cancel_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
{
struct io_cancel *cancel = io_kiocb_to_cmd(req);
struct io_cancel *cancel = io_kiocb_to_cmd(req, struct io_cancel);

if (unlikely(req->flags & REQ_F_BUFFER_SELECT))
return -EINVAL;
Expand Down Expand Up @@ -164,7 +164,7 @@ static int __io_async_cancel(struct io_cancel_data *cd,

int io_async_cancel(struct io_kiocb *req, unsigned int issue_flags)
{
struct io_cancel *cancel = io_kiocb_to_cmd(req);
struct io_cancel *cancel = io_kiocb_to_cmd(req, struct io_cancel);
struct io_cancel_data cd = {
.ctx = req->ctx,
.data = cancel->addr,
Expand Down
4 changes: 2 additions & 2 deletions io_uring/epoll.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ struct io_epoll {

int io_epoll_ctl_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
{
struct io_epoll *epoll = io_kiocb_to_cmd(req);
struct io_epoll *epoll = io_kiocb_to_cmd(req, struct io_epoll);

pr_warn_once("%s: epoll_ctl support in io_uring is deprecated and will "
"be removed in a future Linux kernel version.\n",
Expand All @@ -49,7 +49,7 @@ int io_epoll_ctl_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)

int io_epoll_ctl(struct io_kiocb *req, unsigned int issue_flags)
{
struct io_epoll *ie = io_kiocb_to_cmd(req);
struct io_epoll *ie = io_kiocb_to_cmd(req, struct io_epoll);
int ret;
bool force_nonblock = issue_flags & IO_URING_F_NONBLOCK;

Expand Down
28 changes: 14 additions & 14 deletions io_uring/fs.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ struct io_link {

int io_renameat_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
{
struct io_rename *ren = io_kiocb_to_cmd(req);
struct io_rename *ren = io_kiocb_to_cmd(req, struct io_rename);
const char __user *oldf, *newf;

if (sqe->buf_index || sqe->splice_fd_in)
Expand Down Expand Up @@ -79,7 +79,7 @@ int io_renameat_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)

int io_renameat(struct io_kiocb *req, unsigned int issue_flags)
{
struct io_rename *ren = io_kiocb_to_cmd(req);
struct io_rename *ren = io_kiocb_to_cmd(req, struct io_rename);
int ret;

if (issue_flags & IO_URING_F_NONBLOCK)
Expand All @@ -95,15 +95,15 @@ int io_renameat(struct io_kiocb *req, unsigned int issue_flags)

void io_renameat_cleanup(struct io_kiocb *req)
{
struct io_rename *ren = io_kiocb_to_cmd(req);
struct io_rename *ren = io_kiocb_to_cmd(req, struct io_rename);

putname(ren->oldpath);
putname(ren->newpath);
}

int io_unlinkat_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
{
struct io_unlink *un = io_kiocb_to_cmd(req);
struct io_unlink *un = io_kiocb_to_cmd(req, struct io_unlink);
const char __user *fname;

if (sqe->off || sqe->len || sqe->buf_index || sqe->splice_fd_in)
Expand All @@ -128,7 +128,7 @@ int io_unlinkat_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)

int io_unlinkat(struct io_kiocb *req, unsigned int issue_flags)
{
struct io_unlink *un = io_kiocb_to_cmd(req);
struct io_unlink *un = io_kiocb_to_cmd(req, struct io_unlink);
int ret;

if (issue_flags & IO_URING_F_NONBLOCK)
Expand All @@ -146,14 +146,14 @@ int io_unlinkat(struct io_kiocb *req, unsigned int issue_flags)

void io_unlinkat_cleanup(struct io_kiocb *req)
{
struct io_unlink *ul = io_kiocb_to_cmd(req);
struct io_unlink *ul = io_kiocb_to_cmd(req, struct io_unlink);

putname(ul->filename);
}

int io_mkdirat_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
{
struct io_mkdir *mkd = io_kiocb_to_cmd(req);
struct io_mkdir *mkd = io_kiocb_to_cmd(req, struct io_mkdir);
const char __user *fname;

if (sqe->off || sqe->rw_flags || sqe->buf_index || sqe->splice_fd_in)
Expand All @@ -175,7 +175,7 @@ int io_mkdirat_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)

int io_mkdirat(struct io_kiocb *req, unsigned int issue_flags)
{
struct io_mkdir *mkd = io_kiocb_to_cmd(req);
struct io_mkdir *mkd = io_kiocb_to_cmd(req, struct io_mkdir);
int ret;

if (issue_flags & IO_URING_F_NONBLOCK)
Expand All @@ -190,14 +190,14 @@ int io_mkdirat(struct io_kiocb *req, unsigned int issue_flags)

void io_mkdirat_cleanup(struct io_kiocb *req)
{
struct io_mkdir *md = io_kiocb_to_cmd(req);
struct io_mkdir *md = io_kiocb_to_cmd(req, struct io_mkdir);

putname(md->filename);
}

int io_symlinkat_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
{
struct io_link *sl = io_kiocb_to_cmd(req);
struct io_link *sl = io_kiocb_to_cmd(req, struct io_link);
const char __user *oldpath, *newpath;

if (sqe->len || sqe->rw_flags || sqe->buf_index || sqe->splice_fd_in)
Expand Down Expand Up @@ -225,7 +225,7 @@ int io_symlinkat_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)

int io_symlinkat(struct io_kiocb *req, unsigned int issue_flags)
{
struct io_link *sl = io_kiocb_to_cmd(req);
struct io_link *sl = io_kiocb_to_cmd(req, struct io_link);
int ret;

if (issue_flags & IO_URING_F_NONBLOCK)
Expand All @@ -240,7 +240,7 @@ int io_symlinkat(struct io_kiocb *req, unsigned int issue_flags)

int io_linkat_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
{
struct io_link *lnk = io_kiocb_to_cmd(req);
struct io_link *lnk = io_kiocb_to_cmd(req, struct io_link);
const char __user *oldf, *newf;

if (sqe->rw_flags || sqe->buf_index || sqe->splice_fd_in)
Expand Down Expand Up @@ -270,7 +270,7 @@ int io_linkat_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)

int io_linkat(struct io_kiocb *req, unsigned int issue_flags)
{
struct io_link *lnk = io_kiocb_to_cmd(req);
struct io_link *lnk = io_kiocb_to_cmd(req, struct io_link);
int ret;

if (issue_flags & IO_URING_F_NONBLOCK)
Expand All @@ -286,7 +286,7 @@ int io_linkat(struct io_kiocb *req, unsigned int issue_flags)

void io_link_cleanup(struct io_kiocb *req)
{
struct io_link *sl = io_kiocb_to_cmd(req);
struct io_link *sl = io_kiocb_to_cmd(req, struct io_link);

putname(sl->oldpath);
putname(sl->newpath);
Expand Down
8 changes: 4 additions & 4 deletions io_uring/kbuf.c
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,7 @@ void io_destroy_buffers(struct io_ring_ctx *ctx)

int io_remove_buffers_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
{
struct io_provide_buf *p = io_kiocb_to_cmd(req);
struct io_provide_buf *p = io_kiocb_to_cmd(req, struct io_provide_buf);
u64 tmp;

if (sqe->rw_flags || sqe->addr || sqe->len || sqe->off ||
Expand All @@ -291,7 +291,7 @@ int io_remove_buffers_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)

int io_remove_buffers(struct io_kiocb *req, unsigned int issue_flags)
{
struct io_provide_buf *p = io_kiocb_to_cmd(req);
struct io_provide_buf *p = io_kiocb_to_cmd(req, struct io_provide_buf);
struct io_ring_ctx *ctx = req->ctx;
struct io_buffer_list *bl;
int ret = 0;
Expand Down Expand Up @@ -319,7 +319,7 @@ int io_remove_buffers(struct io_kiocb *req, unsigned int issue_flags)
int io_provide_buffers_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
{
unsigned long size, tmp_check;
struct io_provide_buf *p = io_kiocb_to_cmd(req);
struct io_provide_buf *p = io_kiocb_to_cmd(req, struct io_provide_buf);
u64 tmp;

if (sqe->rw_flags || sqe->splice_fd_in)
Expand Down Expand Up @@ -421,7 +421,7 @@ static int io_add_buffers(struct io_ring_ctx *ctx, struct io_provide_buf *pbuf,

int io_provide_buffers(struct io_kiocb *req, unsigned int issue_flags)
{
struct io_provide_buf *p = io_kiocb_to_cmd(req);
struct io_provide_buf *p = io_kiocb_to_cmd(req, struct io_provide_buf);
struct io_ring_ctx *ctx = req->ctx;
struct io_buffer_list *bl;
int ret = 0;
Expand Down
8 changes: 4 additions & 4 deletions io_uring/msg_ring.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ struct io_msg {
static int io_msg_ring_data(struct io_kiocb *req)
{
struct io_ring_ctx *target_ctx = req->file->private_data;
struct io_msg *msg = io_kiocb_to_cmd(req);
struct io_msg *msg = io_kiocb_to_cmd(req, struct io_msg);

if (msg->src_fd || msg->dst_fd || msg->flags)
return -EINVAL;
Expand Down Expand Up @@ -76,7 +76,7 @@ static int io_double_lock_ctx(struct io_ring_ctx *ctx,
static int io_msg_send_fd(struct io_kiocb *req, unsigned int issue_flags)
{
struct io_ring_ctx *target_ctx = req->file->private_data;
struct io_msg *msg = io_kiocb_to_cmd(req);
struct io_msg *msg = io_kiocb_to_cmd(req, struct io_msg);
struct io_ring_ctx *ctx = req->ctx;
unsigned long file_ptr;
struct file *src_file;
Expand Down Expand Up @@ -122,7 +122,7 @@ static int io_msg_send_fd(struct io_kiocb *req, unsigned int issue_flags)

int io_msg_ring_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
{
struct io_msg *msg = io_kiocb_to_cmd(req);
struct io_msg *msg = io_kiocb_to_cmd(req, struct io_msg);

if (unlikely(sqe->buf_index || sqe->personality))
return -EINVAL;
Expand All @@ -141,7 +141,7 @@ int io_msg_ring_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)

int io_msg_ring(struct io_kiocb *req, unsigned int issue_flags)
{
struct io_msg *msg = io_kiocb_to_cmd(req);
struct io_msg *msg = io_kiocb_to_cmd(req, struct io_msg);
int ret;

ret = -EBADFD;
Expand Down
Loading

0 comments on commit f2ccb5a

Please sign in to comment.