mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-04 10:12:16 +09:00
RDMA/vmw_pvrdma: Fix usage of user response structures in ABI file
commit1f5a6c47aaupstream. This ensures that we return the right structures back to userspace. Otherwise, it looks like the reserved fields in the response structures in userspace might have uninitialized data in them. Fixes:8b10ba783c("RDMA/vmw_pvrdma: Add shared receive queue support") Fixes:29c8d9eba5("IB: Add vmw_pvrdma driver") Suggested-by: Jason Gunthorpe <jgg@mellanox.com> Reviewed-by: Bryan Tan <bryantan@vmware.com> Reviewed-by: Aditya Sarwade <asarwade@vmware.com> Reviewed-by: Jorgen Hansen <jhansen@vmware.com> Signed-off-by: Adit Ranadive <aditr@vmware.com> Signed-off-by: Jason Gunthorpe <jgg@mellanox.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
957435b566
commit
5019b23699
@@ -114,6 +114,7 @@ struct ib_cq *pvrdma_create_cq(struct ib_device *ibdev,
|
||||
union pvrdma_cmd_resp rsp;
|
||||
struct pvrdma_cmd_create_cq *cmd = &req.create_cq;
|
||||
struct pvrdma_cmd_create_cq_resp *resp = &rsp.create_cq_resp;
|
||||
struct pvrdma_create_cq_resp cq_resp = {0};
|
||||
struct pvrdma_create_cq ucmd;
|
||||
|
||||
BUILD_BUG_ON(sizeof(struct pvrdma_cqe) != 64);
|
||||
@@ -198,6 +199,7 @@ struct ib_cq *pvrdma_create_cq(struct ib_device *ibdev,
|
||||
|
||||
cq->ibcq.cqe = resp->cqe;
|
||||
cq->cq_handle = resp->cq_handle;
|
||||
cq_resp.cqn = resp->cq_handle;
|
||||
spin_lock_irqsave(&dev->cq_tbl_lock, flags);
|
||||
dev->cq_tbl[cq->cq_handle % dev->dsr->caps.max_cq] = cq;
|
||||
spin_unlock_irqrestore(&dev->cq_tbl_lock, flags);
|
||||
@@ -206,7 +208,7 @@ struct ib_cq *pvrdma_create_cq(struct ib_device *ibdev,
|
||||
cq->uar = &(to_vucontext(context)->uar);
|
||||
|
||||
/* Copy udata back. */
|
||||
if (ib_copy_to_udata(udata, &cq->cq_handle, sizeof(__u32))) {
|
||||
if (ib_copy_to_udata(udata, &cq_resp, sizeof(cq_resp))) {
|
||||
dev_warn(&dev->pdev->dev,
|
||||
"failed to copy back udata\n");
|
||||
pvrdma_destroy_cq(&cq->ibcq);
|
||||
|
||||
@@ -444,6 +444,7 @@ struct ib_pd *pvrdma_alloc_pd(struct ib_device *ibdev,
|
||||
union pvrdma_cmd_resp rsp;
|
||||
struct pvrdma_cmd_create_pd *cmd = &req.create_pd;
|
||||
struct pvrdma_cmd_create_pd_resp *resp = &rsp.create_pd_resp;
|
||||
struct pvrdma_alloc_pd_resp pd_resp = {0};
|
||||
int ret;
|
||||
void *ptr;
|
||||
|
||||
@@ -472,9 +473,10 @@ struct ib_pd *pvrdma_alloc_pd(struct ib_device *ibdev,
|
||||
pd->privileged = !context;
|
||||
pd->pd_handle = resp->pd_handle;
|
||||
pd->pdn = resp->pd_handle;
|
||||
pd_resp.pdn = resp->pd_handle;
|
||||
|
||||
if (context) {
|
||||
if (ib_copy_to_udata(udata, &pd->pdn, sizeof(__u32))) {
|
||||
if (ib_copy_to_udata(udata, &pd_resp, sizeof(pd_resp))) {
|
||||
dev_warn(&dev->pdev->dev,
|
||||
"failed to copy back protection domain\n");
|
||||
pvrdma_dealloc_pd(&pd->ibpd);
|
||||
|
||||
Reference in New Issue
Block a user