|
@@ -32,6 +32,7 @@
|
|
|
|
|
|
#include <linux/kref.h>
|
|
#include <linux/kref.h>
|
|
#include <rdma/ib_umem.h>
|
|
#include <rdma/ib_umem.h>
|
|
|
|
+#include <rdma/ib_user_verbs.h>
|
|
#include "mlx5_ib.h"
|
|
#include "mlx5_ib.h"
|
|
#include "user.h"
|
|
#include "user.h"
|
|
|
|
|
|
@@ -602,14 +603,24 @@ static int create_cq_user(struct mlx5_ib_dev *dev, struct ib_udata *udata,
|
|
int *cqe_size, int *index, int *inlen)
|
|
int *cqe_size, int *index, int *inlen)
|
|
{
|
|
{
|
|
struct mlx5_ib_create_cq ucmd;
|
|
struct mlx5_ib_create_cq ucmd;
|
|
|
|
+ size_t ucmdlen;
|
|
int page_shift;
|
|
int page_shift;
|
|
int npages;
|
|
int npages;
|
|
int ncont;
|
|
int ncont;
|
|
int err;
|
|
int err;
|
|
|
|
|
|
- if (ib_copy_from_udata(&ucmd, udata, sizeof(ucmd)))
|
|
|
|
|
|
+ ucmdlen =
|
|
|
|
+ (udata->inlen - sizeof(struct ib_uverbs_cmd_hdr) <
|
|
|
|
+ sizeof(ucmd)) ? (sizeof(ucmd) -
|
|
|
|
+ sizeof(ucmd.reserved)) : sizeof(ucmd);
|
|
|
|
+
|
|
|
|
+ if (ib_copy_from_udata(&ucmd, udata, ucmdlen))
|
|
return -EFAULT;
|
|
return -EFAULT;
|
|
|
|
|
|
|
|
+ if (ucmdlen == sizeof(ucmd) &&
|
|
|
|
+ ucmd.reserved != 0)
|
|
|
|
+ return -EINVAL;
|
|
|
|
+
|
|
if (ucmd.cqe_size != 64 && ucmd.cqe_size != 128)
|
|
if (ucmd.cqe_size != 64 && ucmd.cqe_size != 128)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
|
|
|