i40e: Fix of memory leak and integer truncation in i40e_virtchnl.c
authorMartyna Szapar <martyna.szapar@intel.com>
Mon, 15 Apr 2019 21:43:07 +0000 (14:43 -0700)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Sun, 5 May 2019 00:40:25 +0000 (17:40 -0700)
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>
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c

index 6a812ee..ebe1827 100644 (file)
@@ -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);
@@ -3421,7 +3421,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) {
@@ -3429,7 +3429,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)) {
@@ -3437,7 +3437,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);
@@ -3498,13 +3498,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);
 }