diff options
-rw-r--r-- | drivers/infiniband/hw/mlx5/srq.c | 14 | ||||
-rw-r--r-- | drivers/infiniband/hw/mlx5/user.h | 1 |
2 files changed, 14 insertions, 1 deletions
diff --git a/drivers/infiniband/hw/mlx5/srq.c b/drivers/infiniband/hw/mlx5/srq.c index 210b3eaf188a..384af6dec5eb 100644 --- a/drivers/infiniband/hw/mlx5/srq.c +++ b/drivers/infiniband/hw/mlx5/srq.c | |||
@@ -35,6 +35,7 @@ | |||
35 | #include <linux/mlx5/srq.h> | 35 | #include <linux/mlx5/srq.h> |
36 | #include <linux/slab.h> | 36 | #include <linux/slab.h> |
37 | #include <rdma/ib_umem.h> | 37 | #include <rdma/ib_umem.h> |
38 | #include <rdma/ib_user_verbs.h> | ||
38 | 39 | ||
39 | #include "mlx5_ib.h" | 40 | #include "mlx5_ib.h" |
40 | #include "user.h" | 41 | #include "user.h" |
@@ -78,16 +79,27 @@ static int create_srq_user(struct ib_pd *pd, struct mlx5_ib_srq *srq, | |||
78 | { | 79 | { |
79 | struct mlx5_ib_dev *dev = to_mdev(pd->device); | 80 | struct mlx5_ib_dev *dev = to_mdev(pd->device); |
80 | struct mlx5_ib_create_srq ucmd; | 81 | struct mlx5_ib_create_srq ucmd; |
82 | size_t ucmdlen; | ||
81 | int err; | 83 | int err; |
82 | int npages; | 84 | int npages; |
83 | int page_shift; | 85 | int page_shift; |
84 | int ncont; | 86 | int ncont; |
85 | u32 offset; | 87 | u32 offset; |
86 | 88 | ||
87 | if (ib_copy_from_udata(&ucmd, udata, sizeof(ucmd))) { | 89 | ucmdlen = |
90 | (udata->inlen - sizeof(struct ib_uverbs_cmd_hdr) < | ||
91 | sizeof(ucmd)) ? (sizeof(ucmd) - | ||
92 | sizeof(ucmd.reserved)) : sizeof(ucmd); | ||
93 | |||
94 | if (ib_copy_from_udata(&ucmd, udata, ucmdlen)) { | ||
88 | mlx5_ib_dbg(dev, "failed copy udata\n"); | 95 | mlx5_ib_dbg(dev, "failed copy udata\n"); |
89 | return -EFAULT; | 96 | return -EFAULT; |
90 | } | 97 | } |
98 | |||
99 | if (ucmdlen == sizeof(ucmd) && | ||
100 | ucmd.reserved != 0) | ||
101 | return -EINVAL; | ||
102 | |||
91 | srq->wq_sig = !!(ucmd.flags & MLX5_SRQ_FLAG_SIGNATURE); | 103 | srq->wq_sig = !!(ucmd.flags & MLX5_SRQ_FLAG_SIGNATURE); |
92 | 104 | ||
93 | srq->umem = ib_umem_get(pd->uobject->context, ucmd.buf_addr, buf_size, | 105 | srq->umem = ib_umem_get(pd->uobject->context, ucmd.buf_addr, buf_size, |
diff --git a/drivers/infiniband/hw/mlx5/user.h b/drivers/infiniband/hw/mlx5/user.h index d44ecd2c2faf..d0ba264ac1ed 100644 --- a/drivers/infiniband/hw/mlx5/user.h +++ b/drivers/infiniband/hw/mlx5/user.h | |||
@@ -110,6 +110,7 @@ struct mlx5_ib_create_srq { | |||
110 | __u64 buf_addr; | 110 | __u64 buf_addr; |
111 | __u64 db_addr; | 111 | __u64 db_addr; |
112 | __u32 flags; | 112 | __u32 flags; |
113 | __u32 reserved; /* explicit padding (optional on i386) */ | ||
113 | }; | 114 | }; |
114 | 115 | ||
115 | struct mlx5_ib_create_srq_resp { | 116 | struct mlx5_ib_create_srq_resp { |