Skip to content

Commit 6b526d1

Browse files
Junxian Huangrleon
authored andcommitted
RDMA/hns: Fix NULL pointer derefernce in hns_roce_map_mr_sg()
ib_map_mr_sg() allows ULPs to specify NULL as the sg_offset argument. The driver needs to check whether it is a NULL pointer before dereferencing it. Fixes: d387d4b ("RDMA/hns: Fix missing pagesize and alignment check in FRMR") Signed-off-by: Junxian Huang <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Leon Romanovsky <[email protected]>
1 parent 5dbcb1c commit 6b526d1

File tree

1 file changed

+4
-3
lines changed

1 file changed

+4
-3
lines changed

drivers/infiniband/hw/hns/hns_roce_mr.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -435,15 +435,16 @@ static int hns_roce_set_page(struct ib_mr *ibmr, u64 addr)
435435
}
436436

437437
int hns_roce_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg, int sg_nents,
438-
unsigned int *sg_offset)
438+
unsigned int *sg_offset_p)
439439
{
440+
unsigned int sg_offset = sg_offset_p ? *sg_offset_p : 0;
440441
struct hns_roce_dev *hr_dev = to_hr_dev(ibmr->device);
441442
struct ib_device *ibdev = &hr_dev->ib_dev;
442443
struct hns_roce_mr *mr = to_hr_mr(ibmr);
443444
struct hns_roce_mtr *mtr = &mr->pbl_mtr;
444445
int ret, sg_num = 0;
445446

446-
if (!IS_ALIGNED(*sg_offset, HNS_ROCE_FRMR_ALIGN_SIZE) ||
447+
if (!IS_ALIGNED(sg_offset, HNS_ROCE_FRMR_ALIGN_SIZE) ||
447448
ibmr->page_size < HNS_HW_PAGE_SIZE ||
448449
ibmr->page_size > HNS_HW_MAX_PAGE_SIZE)
449450
return sg_num;
@@ -454,7 +455,7 @@ int hns_roce_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg, int sg_nents,
454455
if (!mr->page_list)
455456
return sg_num;
456457

457-
sg_num = ib_sg_to_pages(ibmr, sg, sg_nents, sg_offset, hns_roce_set_page);
458+
sg_num = ib_sg_to_pages(ibmr, sg, sg_nents, sg_offset_p, hns_roce_set_page);
458459
if (sg_num < 1) {
459460
ibdev_err(ibdev, "failed to store sg pages %u %u, cnt = %d.\n",
460461
mr->npages, mr->pbl_mtr.hem_cfg.buf_pg_count, sg_num);

0 commit comments

Comments
 (0)