i40e: rework exit flow of i40e_add_fdir_ethtool
authorJacob Keller <jacob.e.keller@intel.com>
Mon, 6 Feb 2017 22:38:40 +0000 (14:38 -0800)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Mon, 20 Mar 2017 23:45:20 +0000 (16:45 -0700)
Refactor the exit flow of the i40e_add_fdir_ethtool function. Move the
input_label to the end of the function, removing the dependency on
having a non-zero return value. Add a comment explaining why it is ok
not to free the fdir data structure, because the structure is now stored
in the fdir_filter_list.

Change-Id: I723342181d59cd0c9f3b31140c37961ba37bb242
Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/i40e/i40e_ethtool.c

index 7a22b473dbdd884b57a89e2dbda2ffd4739c1237..d16a5a6b24fc27dc9ad1e2d6e6b637c32c99a56d 100644 (file)
@@ -2828,12 +2828,19 @@ static int i40e_add_fdir_ethtool(struct i40e_vsi *vsi,
        }
 
        ret = i40e_add_del_fdir(vsi, input, true);
-free_input:
        if (ret)
-               kfree(input);
-       else
-               i40e_update_ethtool_fdir_entry(vsi, input, fsp->location, NULL);
+               goto free_input;
+
+       /* Add the input filter to the fdir_input_list, possibly replacing
+        * a previous filter. Do not free the input structure after adding it
+        * to the list as this would cause a use-after-free bug.
+        */
+       i40e_update_ethtool_fdir_entry(vsi, input, fsp->location, NULL);
 
+       return 0;
+
+free_input:
+       kfree(input);
        return ret;
 }