Move the null pointer check for 'hw' to the beginning of
txgbe_dev_setup_link_alarm_handler_aml() before any dereference
operation.

Currently, 'hw' is dereferenced via hw->dev_back before the
if (!hw) check. This is a reverse NULL check (REVERSE_INULL)
that renders the null pointer validation ineffective and
introduces undefined behavior.

This check serves as a defensive measure against two scenarios:
1. The function is called with a NULL parameter.
2. During application exit, rte_eth_dev_release_port() frees
   the port private data (dev_private) while an alarm callback
   is still pending or being executed. In such cases, checking
   'hw' early helps prevent access to already freed memory.

Coverity issue: 504601
Fixes: 6104fd11086e ("net/txgbe: fix link stability for 25G NIC")
Cc: [email protected]

Signed-off-by: Zaiyu Wang <[email protected]>
---
 drivers/net/txgbe/txgbe_ethdev.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/drivers/net/txgbe/txgbe_ethdev.c b/drivers/net/txgbe/txgbe_ethdev.c
index 9a1cb448ad..4d2746371b 100644
--- a/drivers/net/txgbe/txgbe_ethdev.c
+++ b/drivers/net/txgbe/txgbe_ethdev.c
@@ -3264,15 +3264,16 @@ void
 txgbe_dev_setup_link_alarm_handler_aml(void *param)
 {
        struct txgbe_hw *hw = (struct txgbe_hw *)param;
+
+       if (!hw)
+               return;
+
        struct rte_eth_dev *dev = (struct rte_eth_dev *)hw->dev_back;
        struct txgbe_interrupt *intr = TXGBE_DEV_INTR(dev);
        u32 speed;
        bool autoneg = false;
        u32 gssr = hw->phy.phy_semaphore_mask;
 
-       if (!hw)
-               return;
-
        speed = hw->phy.autoneg_advertised;
        if (!speed)
                hw->mac.get_link_capabilities(hw, &speed, &autoneg);
-- 
2.21.0.windows.1

Reply via email to