Skip to content

Commit aefecea

Browse files
2045geminigregkh
authored andcommitted
ice: Fix improper handling of refcount in ice_dpll_init_rclk_pins()
commit ccca30a upstream. This patch addresses a reference count handling issue in the ice_dpll_init_rclk_pins() function. The function calls ice_dpll_get_pins(), which increments the reference count of the relevant resources. However, if the condition WARN_ON((!vsi || !vsi->netdev)) is met, the function currently returns an error without properly releasing the resources acquired by ice_dpll_get_pins(), leading to a reference count leak. To resolve this, the check has been moved to the top of the function. This ensures that the function verifies the state before any resources are acquired, avoiding the need for additional resource management in the error path. This bug was identified by an experimental static analysis tool developed by our team. The tool specializes in analyzing reference count operations and detecting potential issues where resources are not properly managed. In this case, the tool flagged the missing release operation as a potential problem, which led to the development of this patch. Fixes: d7999f5 ("ice: implement dpll interface to control cgu") Cc: stable@vger.kernel.org Signed-off-by: Gui-Dong Han <hanguidong02@outlook.com> Reviewed-by: Simon Horman <horms@kernel.org> Tested-by: Pucha Himasekhar Reddy <himasekharx.reddy.pucha@intel.com> (A Contingent worker at Intel) Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent e877427 commit aefecea

1 file changed

Lines changed: 2 additions & 2 deletions

File tree

drivers/net/ethernet/intel/ice/ice_dpll.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1628,6 +1628,8 @@ ice_dpll_init_rclk_pins(struct ice_pf *pf, struct ice_dpll_pin *pin,
16281628
struct dpll_pin *parent;
16291629
int ret, i;
16301630

1631+
if (WARN_ON((!vsi || !vsi->netdev)))
1632+
return -EINVAL;
16311633
ret = ice_dpll_get_pins(pf, pin, start_idx, ICE_DPLL_RCLK_NUM_PER_PF,
16321634
pf->dplls.clock_id);
16331635
if (ret)
@@ -1643,8 +1645,6 @@ ice_dpll_init_rclk_pins(struct ice_pf *pf, struct ice_dpll_pin *pin,
16431645
if (ret)
16441646
goto unregister_pins;
16451647
}
1646-
if (WARN_ON((!vsi || !vsi->netdev)))
1647-
return -EINVAL;
16481648
dpll_netdev_pin_set(vsi->netdev, pf->dplls.rclk.pin);
16491649

16501650
return 0;

0 commit comments

Comments
 (0)