]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
RDMA: Use ib_copy_validate_udata_in() for implicit full structs
authorJason Gunthorpe <jgg@nvidia.com>
Wed, 25 Mar 2026 21:26:50 +0000 (18:26 -0300)
committerLeon Romanovsky <leonro@nvidia.com>
Tue, 31 Mar 2026 07:11:01 +0000 (03:11 -0400)
All of these cases have git blames that say the entire current struct
was introduced at once, so the last member is the right choice.

Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
drivers/infiniband/hw/erdma/erdma_verbs.c
drivers/infiniband/hw/ionic/ionic_controlpath.c
drivers/infiniband/hw/mthca/mthca_provider.c
drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
drivers/infiniband/hw/qedr/verbs.c
drivers/infiniband/hw/usnic/usnic_ib_verbs.c
drivers/infiniband/hw/vmw_pvrdma/pvrdma_qp.c
drivers/infiniband/hw/vmw_pvrdma/pvrdma_srq.c

index 04136a0281aa4c0da42cc66dfeecd096cb40a283..5523b4e151e1ff0ada19bc8b710ce24693d23472 100644 (file)
@@ -1039,8 +1039,7 @@ int erdma_create_qp(struct ib_qp *ibqp, struct ib_qp_init_attr *attrs,
        qp->attrs.rq_size = roundup_pow_of_two(attrs->cap.max_recv_wr);
 
        if (uctx) {
-               ret = ib_copy_from_udata(&ureq, udata,
-                                        min(sizeof(ureq), udata->inlen));
+               ret = ib_copy_validate_udata_in(udata, ureq, rsvd0);
                if (ret)
                        goto err_out_xa;
 
@@ -1980,8 +1979,7 @@ int erdma_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,
                struct erdma_ureq_create_cq ureq;
                struct erdma_uresp_create_cq uresp;
 
-               ret = ib_copy_from_udata(&ureq, udata,
-                                        min(udata->inlen, sizeof(ureq)));
+               ret = ib_copy_validate_udata_in(udata, ureq, rsvd0);
                if (ret)
                        goto err_out_xa;
 
index a5671da3db648026bc1c3fcceb73a9c65544d856..7051a81cca94207acfb42c2cc0f8a95385500abf 100644 (file)
@@ -373,7 +373,7 @@ int ionic_alloc_ucontext(struct ib_ucontext *ibctx, struct ib_udata *udata)
        phys_addr_t db_phys = 0;
        int rc;
 
-       rc = ib_copy_from_udata(&req, udata, sizeof(req));
+       rc = ib_copy_validate_udata_in(udata, req, rsvd);
        if (rc)
                return rc;
 
@@ -1225,7 +1225,7 @@ int ionic_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,
        int udma_idx = 0, rc;
 
        if (udata) {
-               rc = ib_copy_from_udata(&req, udata, sizeof(req));
+               rc = ib_copy_validate_udata_in(udata, req, rsvd);
                if (rc)
                        return rc;
        }
@@ -2154,7 +2154,7 @@ int ionic_create_qp(struct ib_qp *ibqp, struct ib_qp_init_attr *attr,
        int rc;
 
        if (udata) {
-               rc = ib_copy_from_udata(&req, udata, sizeof(req));
+               rc = ib_copy_validate_udata_in(udata, req, rsvd);
                if (rc)
                        return rc;
        } else {
index ca4cc7b9bf2ed92f064e6b4849e39e007f0d50d1..e8d5d865c1f1f77532084ef316ef51b95d79032c 100644 (file)
@@ -402,8 +402,9 @@ static int mthca_create_srq(struct ib_srq *ibsrq,
                return -EOPNOTSUPP;
 
        if (udata) {
-               if (ib_copy_from_udata(&ucmd, udata, sizeof(ucmd)))
-                       return -EFAULT;
+               err = ib_copy_validate_udata_in(udata, ucmd, db_page);
+               if (err)
+                       return err;
 
                err = mthca_map_user_db(to_mdev(ibsrq->device), &context->uar,
                                        context->db_tab, ucmd.db_index,
@@ -472,8 +473,9 @@ static int mthca_create_qp(struct ib_qp *ibqp,
        case IB_QPT_UD:
        {
                if (udata) {
-                       if (ib_copy_from_udata(&ucmd, udata, sizeof(ucmd)))
-                               return -EFAULT;
+                       err = ib_copy_validate_udata_in(udata, ucmd, rq_db_index);
+                       if (err)
+                               return err;
 
                        err = mthca_map_user_db(dev, &context->uar,
                                                context->db_tab,
@@ -594,8 +596,9 @@ static int mthca_create_cq(struct ib_cq *ibcq,
                return -EINVAL;
 
        if (udata) {
-               if (ib_copy_from_udata(&ucmd, udata, sizeof(ucmd)))
-                       return -EFAULT;
+               err = ib_copy_validate_udata_in(udata, ucmd, set_db_index);
+               if (err)
+                       return err;
 
                err = mthca_map_user_db(to_mdev(ibdev), &context->uar,
                                        context->db_tab, ucmd.set_db_index,
@@ -721,10 +724,9 @@ static int mthca_resize_cq(struct ib_cq *ibcq, unsigned int entries,
                        goto out;
                lkey = cq->resize_buf->buf.mr.ibmr.lkey;
        } else {
-               if (ib_copy_from_udata(&ucmd, udata, sizeof ucmd)) {
-                       ret = -EFAULT;
+               ret = ib_copy_validate_udata_in(udata, ucmd, reserved);
+               if (ret)
                        goto out;
-               }
                lkey = ucmd.lkey;
        }
 
@@ -852,8 +854,11 @@ static struct ib_mr *mthca_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
                }
                ++context->reg_mr_warned;
                ucmd.mr_attrs = 0;
-       } else if (ib_copy_from_udata(&ucmd, udata, sizeof ucmd))
-               return ERR_PTR(-EFAULT);
+       } else {
+               err = ib_copy_validate_udata_in(udata, ucmd, reserved);
+               if (err)
+                       return ERR_PTR(err);
+       }
 
        mr = kmalloc_obj(*mr);
        if (!mr)
index ec57807bc417a8abe79808448138acf7b8f7a0ce..f26df52988ffff48757e0426826c4faf5cafa4ca 100644 (file)
@@ -982,8 +982,9 @@ int ocrdma_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,
                return -EOPNOTSUPP;
 
        if (udata) {
-               if (ib_copy_from_udata(&ureq, udata, sizeof(ureq)))
-                       return -EFAULT;
+               status = ib_copy_validate_udata_in(udata, ureq, rsvd);
+               if (status)
+                       return status;
        } else
                ureq.dpp_cq = 0;
 
@@ -1309,8 +1310,9 @@ int ocrdma_create_qp(struct ib_qp *ibqp, struct ib_qp_init_attr *attrs,
 
        memset(&ureq, 0, sizeof(ureq));
        if (udata) {
-               if (ib_copy_from_udata(&ureq, udata, sizeof(ureq)))
-                       return -EFAULT;
+               status = ib_copy_validate_udata_in(udata, ureq, rsvd1);
+               if (status)
+                       return status;
        }
        ocrdma_set_qp_init_params(qp, pd, attrs);
        if (udata == NULL)
index 2fa9e07710d31f821569e77db44ecef4f3dbc177..42d20b35ff3fe097a742274b836e1a36a0542db7 100644 (file)
@@ -273,12 +273,9 @@ int qedr_alloc_ucontext(struct ib_ucontext *uctx, struct ib_udata *udata)
                return -EFAULT;
 
        if (udata->inlen) {
-               rc = ib_copy_from_udata(&ureq, udata,
-                                       min(sizeof(ureq), udata->inlen));
-               if (rc) {
-                       DP_ERR(dev, "Problem copying data from user space\n");
-                       return -EFAULT;
-               }
+               rc = ib_copy_validate_udata_in(udata, ureq, reserved);
+               if (rc)
+                       return rc;
                ctx->edpm_mode = !!(ureq.context_flags &
                                    QEDR_ALLOC_UCTX_EDPM_MODE);
                ctx->db_rec = !!(ureq.context_flags & QEDR_ALLOC_UCTX_DB_REC);
@@ -949,12 +946,9 @@ int qedr_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,
        db_offset = DB_ADDR_SHIFT(DQ_PWM_OFFSET_UCM_RDMA_CQ_CONS_32BIT);
 
        if (udata) {
-               if (ib_copy_from_udata(&ureq, udata, min(sizeof(ureq),
-                                                        udata->inlen))) {
-                       DP_ERR(dev,
-                              "create cq: problem copying data from user space\n");
-                       goto err0;
-               }
+               rc = ib_copy_validate_udata_in(udata, ureq, len);
+               if (rc)
+                       return rc;
 
                if (!ureq.len) {
                        DP_ERR(dev,
@@ -1575,12 +1569,9 @@ int qedr_create_srq(struct ib_srq *ibsrq, struct ib_srq_init_attr *init_attr,
        hw_srq->max_sges = init_attr->attr.max_sge;
 
        if (udata) {
-               if (ib_copy_from_udata(&ureq, udata, min(sizeof(ureq),
-                                                        udata->inlen))) {
-                       DP_ERR(dev,
-                              "create srq: problem copying data from user space\n");
-                       goto err0;
-               }
+               rc = ib_copy_validate_udata_in(udata, ureq, srq_len);
+               if (rc)
+                       return rc;
 
                rc = qedr_init_srq_user_params(udata, srq, &ureq, 0);
                if (rc)
@@ -1860,12 +1851,9 @@ static int qedr_create_user_qp(struct qedr_dev *dev,
        }
 
        if (udata) {
-               rc = ib_copy_from_udata(&ureq, udata, min(sizeof(ureq),
-                                       udata->inlen));
-               if (rc) {
-                       DP_ERR(dev, "Problem copying data from user space\n");
+               rc = ib_copy_validate_udata_in(udata, ureq, rq_len);
+               if (rc)
                        return rc;
-               }
        }
 
        if (qedr_qp_has_sq(qp)) {
index 16b269128f52d37847587070f5b4618c51055e94..615de9c4209bf1811afcb51e2a1cb5f1f33dc122 100644 (file)
@@ -476,7 +476,7 @@ int usnic_ib_create_qp(struct ib_qp *ibqp, struct ib_qp_init_attr *init_attr,
        if (init_attr->create_flags)
                return -EOPNOTSUPP;
 
-       err = ib_copy_from_udata(&cmd, udata, sizeof(cmd));
+       err = ib_copy_validate_udata_in(udata, cmd, spec);
        if (err) {
                usnic_err("%s: cannot copy udata for create_qp\n",
                          dev_name(&us_ibdev->ib_dev.dev));
index 98b2a0090bf2a13f54eecf7277fdbc26f506eac0..16aab967a20308fbd81edc97a8119fec64dee5e2 100644 (file)
@@ -49,6 +49,7 @@
 #include <rdma/ib_addr.h>
 #include <rdma/ib_smi.h>
 #include <rdma/ib_user_verbs.h>
+#include <rdma/uverbs_ioctl.h>
 
 #include "pvrdma.h"
 
@@ -252,10 +253,9 @@ int pvrdma_create_qp(struct ib_qp *ibqp, struct ib_qp_init_attr *init_attr,
                        dev_dbg(&dev->pdev->dev,
                                "create queuepair from user space\n");
 
-                       if (ib_copy_from_udata(&ucmd, udata, sizeof(ucmd))) {
-                               ret = -EFAULT;
+                       ret = ib_copy_validate_udata_in(udata, ucmd, qp_addr);
+                       if (ret)
                                goto err_qp;
-                       }
 
                        /* Userspace supports qpn and qp handles? */
                        if (dev->dsr_version >= PVRDMA_QPHANDLE_VERSION &&
index bdc2703532c6cc1ee8276c41050eaad148641c08..d31fb692fcaafbf371f6b57d914a7d22a778d02d 100644 (file)
@@ -49,6 +49,7 @@
 #include <rdma/ib_addr.h>
 #include <rdma/ib_smi.h>
 #include <rdma/ib_user_verbs.h>
+#include <rdma/uverbs_ioctl.h>
 
 #include "pvrdma.h"
 
@@ -141,10 +142,9 @@ int pvrdma_create_srq(struct ib_srq *ibsrq, struct ib_srq_init_attr *init_attr,
        dev_dbg(&dev->pdev->dev,
                "create shared receive queue from user space\n");
 
-       if (ib_copy_from_udata(&ucmd, udata, sizeof(ucmd))) {
-               ret = -EFAULT;
+       ret = ib_copy_validate_udata_in(udata, ucmd, reserved);
+       if (ret)
                goto err_srq;
-       }
 
        srq->umem = ib_umem_get(ibsrq->device, ucmd.buf_addr, ucmd.buf_size, 0);
        if (IS_ERR(srq->umem)) {