diff options
| author | Jan Glaza <jan.glaza@intel.com> | 2025-03-04 12:08:33 +0100 | 
|---|---|---|
| committer | Tony Nguyen <anthony.l.nguyen@intel.com> | 2025-03-18 09:38:16 -0700 | 
| commit | e2f7d3f7331b92cb820da23e8c45133305da1e63 (patch) | |
| tree | ecee1a7f7cb3e46522c425db88d5b972e70a1b20 /drivers/net/ethernet/intel/ice/ice_virtchnl.c | |
| parent | f91d0efcc3dd7b341bb370499b99dc02d4fb792f (diff) | |
ice: validate queue quanta parameters to prevent OOB access
Add queue wraparound prevention in quanta configuration.
Ensure end_qid does not overflow by validating start_qid and num_queues.
Fixes: 015307754a19 ("ice: Support VF queue rate limit and quanta size configuration")
Reviewed-by: Jedrzej Jagielski <jedrzej.jagielski@intel.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Signed-off-by: Jan Glaza <jan.glaza@intel.com>
Signed-off-by: Martyna Szapar-Mudlaw <martyna.szapar-mudlaw@linux.intel.com>
Tested-by: Rafal Romanowski <rafal.romanowski@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
Diffstat (limited to 'drivers/net/ethernet/intel/ice/ice_virtchnl.c')
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_virtchnl.c | 13 | 
1 files changed, 9 insertions, 4 deletions
| diff --git a/drivers/net/ethernet/intel/ice/ice_virtchnl.c b/drivers/net/ethernet/intel/ice/ice_virtchnl.c index 346aee373ccd..df13f5110168 100644 --- a/drivers/net/ethernet/intel/ice/ice_virtchnl.c +++ b/drivers/net/ethernet/intel/ice/ice_virtchnl.c @@ -1900,13 +1900,21 @@ err:   */  static int ice_vc_cfg_q_quanta(struct ice_vf *vf, u8 *msg)  { +	u16 quanta_prof_id, quanta_size, start_qid, num_queues, end_qid, i;  	enum virtchnl_status_code v_ret = VIRTCHNL_STATUS_SUCCESS; -	u16 quanta_prof_id, quanta_size, start_qid, end_qid, i;  	struct virtchnl_quanta_cfg *qquanta =  		(struct virtchnl_quanta_cfg *)msg;  	struct ice_vsi *vsi;  	int ret; +	start_qid = qquanta->queue_select.start_queue_id; +	num_queues = qquanta->queue_select.num_queues; + +	if (check_add_overflow(start_qid, num_queues, &end_qid)) { +		v_ret = VIRTCHNL_STATUS_ERR_PARAM; +		goto err; +	} +  	if (!test_bit(ICE_VF_STATE_ACTIVE, vf->vf_states)) {  		v_ret = VIRTCHNL_STATUS_ERR_PARAM;  		goto err; @@ -1918,8 +1926,6 @@ static int ice_vc_cfg_q_quanta(struct ice_vf *vf, u8 *msg)  		goto err;  	} -	end_qid = qquanta->queue_select.start_queue_id + -		  qquanta->queue_select.num_queues;  	if (end_qid > ICE_MAX_RSS_QS_PER_VF ||  	    end_qid > min_t(u16, vsi->alloc_txq, vsi->alloc_rxq)) {  		dev_err(ice_pf_to_dev(vf->pf), "VF-%d trying to configure more than allocated number of queues: %d\n", @@ -1948,7 +1954,6 @@ static int ice_vc_cfg_q_quanta(struct ice_vf *vf, u8 *msg)  		goto err;  	} -	start_qid = qquanta->queue_select.start_queue_id;  	for (i = start_qid; i < end_qid; i++)  		vsi->tx_rings[i]->quanta_prof_id = quanta_prof_id; | 
