]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: usb: lan78xx: fix possible NULL pointer dereference in lan78xx_phy_init()
authorOleksij Rempel <o.rempel@pengutronix.de>
Thu, 26 Jun 2025 10:37:31 +0000 (12:37 +0200)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 1 Jul 2025 10:42:51 +0000 (12:42 +0200)
If no PHY device is found (e.g., for LAN7801 in fixed-link mode),
lan78xx_phy_init() may proceed to dereference a NULL phydev pointer,
leading to a crash.

Update the logic to perform MAC configuration first, then check for the presence
of a PHY. For the fixed-link case, set up the fixed link and return early,
bypassing any code that assumes a valid phydev pointer.

It is safe to move lan78xx_mac_prepare_for_phy() earlier because this function
only uses information from dev->interface, which is configured by
lan78xx_get_phy() beforehand. The function does not access phydev or any data
set up by later steps.

Reported-by: Dan Carpenter <dan.carpenter@linaro.org>
Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
Fixes: e110bc825897 ("net: usb: lan78xx: Convert to PHYLINK for improved PHY and MAC management")
Link: https://patch.msgid.link/20250626103731.3986545-1-o.rempel@pengutronix.de
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/usb/lan78xx.c

index f00284c9ad34ffe5f31dd62fdc62bde0791776f6..f3347fb0c400942b72ac6221df957fb16fab49bc 100644 (file)
@@ -2831,6 +2831,10 @@ static int lan78xx_phy_init(struct lan78xx_net *dev)
        if (ret < 0)
                return ret;
 
+       ret = lan78xx_mac_prepare_for_phy(dev);
+       if (ret < 0)
+               goto phylink_uninit;
+
        /* If no PHY is found, set up a fixed link. It is very specific to
         * the LAN7801 and is used in special cases like EVB-KSZ9897-1 where
         * LAN7801 acts as a USB-to-Ethernet interface to a switch without
@@ -2840,11 +2844,12 @@ static int lan78xx_phy_init(struct lan78xx_net *dev)
                ret = lan78xx_set_fixed_link(dev);
                if (ret < 0)
                        goto phylink_uninit;
-       }
 
-       ret = lan78xx_mac_prepare_for_phy(dev);
-       if (ret < 0)
-               goto phylink_uninit;
+               /* No PHY found, so set up a fixed link and return early.
+                * No need to configure PHY IRQ or attach to phylink.
+                */
+               return 0;
+       }
 
        /* if phyirq is not set, use polling mode in phylib */
        if (dev->domain_data.phyirq > 0)