RDMA/hns: Prevent undefined behavior in hns_roce_set_user_sq_size()
The "ucmd->log_sq_bb_count" variable is a user controlled variable in the 0-255 range. If we shift more than then number of bits in an int then it's undefined behavior (it shift wraps), and potentially the int could become negative. Fixes: 9a4435375cd1 ("IB/hns: Add driver files for hns RoCE driver") Link: https://lore.kernel.org/r/20190608092514.GC28890@mwanda Reported-by: Dan Carpenter <dan.carpenter@oracle.com> Signed-off-by: Jason Gunthorpe <jgg@mellanox.com> Reviewed-by: Dan Carpenter <dan.carpenter@oracle.com>
This commit is contained in:
parent
24f5214923
commit
515f60004e
@ -332,9 +332,8 @@ static int check_sq_size_with_integrity(struct hns_roce_dev *hr_dev,
|
|||||||
u8 max_sq_stride = ilog2(roundup_sq_stride);
|
u8 max_sq_stride = ilog2(roundup_sq_stride);
|
||||||
|
|
||||||
/* Sanity check SQ size before proceeding */
|
/* Sanity check SQ size before proceeding */
|
||||||
if ((u32)(1 << ucmd->log_sq_bb_count) > hr_dev->caps.max_wqes ||
|
if (ucmd->log_sq_stride > max_sq_stride ||
|
||||||
ucmd->log_sq_stride > max_sq_stride ||
|
ucmd->log_sq_stride < HNS_ROCE_IB_MIN_SQ_STRIDE) {
|
||||||
ucmd->log_sq_stride < HNS_ROCE_IB_MIN_SQ_STRIDE) {
|
|
||||||
ibdev_err(&hr_dev->ib_dev, "check SQ size error!\n");
|
ibdev_err(&hr_dev->ib_dev, "check SQ size error!\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
@ -358,13 +357,16 @@ static int hns_roce_set_user_sq_size(struct hns_roce_dev *hr_dev,
|
|||||||
u32 max_cnt;
|
u32 max_cnt;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
if (check_shl_overflow(1, ucmd->log_sq_bb_count, &hr_qp->sq.wqe_cnt) ||
|
||||||
|
hr_qp->sq.wqe_cnt > hr_dev->caps.max_wqes)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
ret = check_sq_size_with_integrity(hr_dev, cap, ucmd);
|
ret = check_sq_size_with_integrity(hr_dev, cap, ucmd);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
ibdev_err(&hr_dev->ib_dev, "Sanity check sq size failed\n");
|
ibdev_err(&hr_dev->ib_dev, "Sanity check sq size failed\n");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
hr_qp->sq.wqe_cnt = 1 << ucmd->log_sq_bb_count;
|
|
||||||
hr_qp->sq.wqe_shift = ucmd->log_sq_stride;
|
hr_qp->sq.wqe_shift = ucmd->log_sq_stride;
|
||||||
|
|
||||||
max_cnt = max(1U, cap->max_send_sge);
|
max_cnt = max(1U, cap->max_send_sge);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user