| From a211a6ec10340637102f01e1536df42d13d38656 Mon Sep 17 00:00:00 2001 |
| From: Martyna Szapar <martyna.szapar@intel.com> |
| Date: Mon, 15 Apr 2019 14:43:07 -0700 |
| Subject: i40e: Fix of memory leak and integer truncation in i40e_virtchnl.c |
| |
| [ Upstream commit 24474f2709af6729b9b1da1c5e160ab62e25e3a4 ] |
| |
| Fixed possible memory leak in i40e_vc_add_cloud_filter function: |
| cfilter is being allocated and in some error conditions |
| the function returns without freeing the memory. |
| |
| Fix of integer truncation from u16 (type of queue_id value) to u8 |
| when calling i40e_vc_isvalid_queue_id function. |
| |
| Signed-off-by: Martyna Szapar <martyna.szapar@intel.com> |
| Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| .../net/ethernet/intel/i40e/i40e_virtchnl_pf.c | 16 ++++++++++------ |
| 1 file changed, 10 insertions(+), 6 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c |
| index 831d52bc3c9ae..0b5b867c9fbcb 100644 |
| --- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c |
| +++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c |
| @@ -181,7 +181,7 @@ static inline bool i40e_vc_isvalid_vsi_id(struct i40e_vf *vf, u16 vsi_id) |
| * check for the valid queue id |
| **/ |
| static inline bool i40e_vc_isvalid_queue_id(struct i40e_vf *vf, u16 vsi_id, |
| - u8 qid) |
| + u16 qid) |
| { |
| struct i40e_pf *pf = vf->pf; |
| struct i40e_vsi *vsi = i40e_find_vsi_from_id(pf, vsi_id); |
| @@ -3374,7 +3374,7 @@ static int i40e_vc_add_cloud_filter(struct i40e_vf *vf, u8 *msg) |
| |
| if (!test_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states)) { |
| aq_ret = I40E_ERR_PARAM; |
| - goto err; |
| + goto err_out; |
| } |
| |
| if (!vf->adq_enabled) { |
| @@ -3382,7 +3382,7 @@ static int i40e_vc_add_cloud_filter(struct i40e_vf *vf, u8 *msg) |
| "VF %d: ADq is not enabled, can't apply cloud filter\n", |
| vf->vf_id); |
| aq_ret = I40E_ERR_PARAM; |
| - goto err; |
| + goto err_out; |
| } |
| |
| if (i40e_validate_cloud_filter(vf, vcf)) { |
| @@ -3390,7 +3390,7 @@ static int i40e_vc_add_cloud_filter(struct i40e_vf *vf, u8 *msg) |
| "VF %d: Invalid input/s, can't apply cloud filter\n", |
| vf->vf_id); |
| aq_ret = I40E_ERR_PARAM; |
| - goto err; |
| + goto err_out; |
| } |
| |
| cfilter = kzalloc(sizeof(*cfilter), GFP_KERNEL); |
| @@ -3451,13 +3451,17 @@ static int i40e_vc_add_cloud_filter(struct i40e_vf *vf, u8 *msg) |
| "VF %d: Failed to add cloud filter, err %s aq_err %s\n", |
| vf->vf_id, i40e_stat_str(&pf->hw, ret), |
| i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); |
| - goto err; |
| + goto err_free; |
| } |
| |
| INIT_HLIST_NODE(&cfilter->cloud_node); |
| hlist_add_head(&cfilter->cloud_node, &vf->cloud_filter_list); |
| + /* release the pointer passing it to the collection */ |
| + cfilter = NULL; |
| vf->num_cloud_filters++; |
| -err: |
| +err_free: |
| + kfree(cfilter); |
| +err_out: |
| return i40e_vc_send_resp_to_vf(vf, VIRTCHNL_OP_ADD_CLOUD_FILTER, |
| aq_ret); |
| } |
| -- |
| 2.20.1 |
| |