net: phy: Fix use after free in phy_detach()
authorGeert Uytterhoeven <geert+renesas@glider.be>
Mon, 28 Nov 2016 14:18:31 +0000 (15:18 +0100)
committerDavid S. Miller <davem@davemloft.net>
Wed, 30 Nov 2016 01:35:24 +0000 (20:35 -0500)
If device_release_driver(&phydev->mdio.dev) is called, it releases all
resources belonging to the PHY device. Hence the subsequent call to
phy_led_triggers_unregister() will access already freed memory when
unregistering the LEDs.

Move the call to phy_led_triggers_unregister() before the possible call
to device_release_driver() to fix this.

Fixes: 2e0bc452f4721520 ("net: phy: leds: add support for led triggers on phy link state change")
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Tested-by: Zach Brown <zach.brown@ni.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/phy/phy_device.c

index 83e52f1b80f205fb4fe3248a8520e497152063b9..aeaf1bcb12d01f61b209188424a204e42ef738c9 100644 (file)
@@ -981,6 +981,8 @@ void phy_detach(struct phy_device *phydev)
        phydev->attached_dev = NULL;
        phy_suspend(phydev);
 
+       phy_led_triggers_unregister(phydev);
+
        /* If the device had no specific driver before (i.e. - it
         * was using the generic driver), we unbind the device
         * from the generic driver so that there's a chance a
@@ -994,8 +996,6 @@ void phy_detach(struct phy_device *phydev)
                }
        }
 
-       phy_led_triggers_unregister(phydev);
-
        /*
         * The phydev might go away on the put_device() below, so avoid
         * a use-after-free bug by reading the underlying bus first.