Message ID | 20240930223601.3137464-4-anthony.l.nguyen@intel.com (mailing list archive) |
---|---|
State | Accepted |
Commit | d517cf89874c6039e6294b18d66f40988e62502a |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | Intel Wired LAN Driver Updates 2024-09-30 (ice, idpf) | expand |
On Tue, Oct 1, 2024 at 4:06 AM Tony Nguyen <anthony.l.nguyen@intel.com> wrote: > > From: Gui-Dong Han <hanguidong02@outlook.com> > > This patch addresses an issue with improper reference count handling in the > ice_sriov_set_msix_vec_count() function. > > First, the function calls ice_get_vf_by_id(), which increments the > reference count of the vf pointer. If the subsequent call to > ice_get_vf_vsi() fails, the function currently returns an error without > decrementing the reference count of the vf pointer, leading to a reference > count leak. The correct behavior, as implemented in this patch, is to > decrement the reference count using ice_put_vf(vf) before returning an > error when vsi is NULL. > > Second, the function calls ice_sriov_get_irqs(), which sets > vf->first_vector_idx. If this call returns a negative value, indicating an > error, the function returns an error without decrementing the reference > count of the vf pointer, resulting in another reference count leak. The > patch addresses this by adding a call to ice_put_vf(vf) before returning > an error when vf->first_vector_idx < 0. > > This bug was identified by an experimental static analysis tool developed > by our team. The tool specializes in analyzing reference count operations > and identifying potential mismanagement of reference counts. In this case, > the tool flagged the missing decrement operation as a potential issue, > leading to this patch. > > Fixes: 4035c72dc1ba ("ice: reconfig host after changing MSI-X on VF") > Fixes: 4d38cb44bd32 ("ice: manage VFs MSI-X using resource tracking") > Cc: stable@vger.kernel.org > Signed-off-by: Gui-Dong Han <hanguidong02@outlook.com> > Reviewed-by: Simon Horman <horms@kernel.org> > Tested-by: Rafal Romanowski <rafal.romanowski@intel.com> > Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com> LGTM, Reviewed-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
diff --git a/drivers/net/ethernet/intel/ice/ice_sriov.c b/drivers/net/ethernet/intel/ice/ice_sriov.c index e34fe2516ccc..c2d6b2a144e9 100644 --- a/drivers/net/ethernet/intel/ice/ice_sriov.c +++ b/drivers/net/ethernet/intel/ice/ice_sriov.c @@ -1096,8 +1096,10 @@ int ice_sriov_set_msix_vec_count(struct pci_dev *vf_dev, int msix_vec_count) return -ENOENT; vsi = ice_get_vf_vsi(vf); - if (!vsi) + if (!vsi) { + ice_put_vf(vf); return -ENOENT; + } prev_msix = vf->num_msix; prev_queues = vf->num_vf_qs; @@ -1142,8 +1144,10 @@ int ice_sriov_set_msix_vec_count(struct pci_dev *vf_dev, int msix_vec_count) vf->num_msix = prev_msix; vf->num_vf_qs = prev_queues; vf->first_vector_idx = ice_sriov_get_irqs(pf, vf->num_msix); - if (vf->first_vector_idx < 0) + if (vf->first_vector_idx < 0) { + ice_put_vf(vf); return -EINVAL; + } if (needs_rebuild) { ice_vf_reconfig_vsi(vf);