Message ID | m3ej07zg85.fsf@maximus.localdomain |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
From: Krzysztof Halasa <khc@pm.waw.pl> Date: Wed, 17 Dec 2008 03:29:46 +0100 > kernel BUG at drivers/net/phy/mdio_bus.c:165! > Unable to handle kernel NULL pointer dereference at virtual address 00000000 > > How? > > mdiobus_alloc() sets bus->state = MDIOBUS_ALLOCATED. > > mdiobus_register() sets bus->state = MDIOBUS_REGISTERED but then can > fail (mdiobus_scan()) returning an error to the caller. > > The caller aborts correctly with mdiobus_free() which does: > if (bus->state == MDIOBUS_ALLOCATED) { > kfree(bus); > return; > } > > BUG_ON(bus->state != MDIOBUS_UNREGISTERED); > > Signed-off-by: Krzysztof Halasa <khc@pm.waw.pl> Looks great, applied. Thanks for fixing this bug Krzysztof. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
--- a/drivers/net/phy/mdio_bus.c +++ b/drivers/net/phy/mdio_bus.c @@ -105,8 +105,6 @@ int mdiobus_register(struct mii_bus *bus) return -EINVAL; } - bus->state = MDIOBUS_REGISTERED; - mutex_init(&bus->mdio_lock); if (bus->reset) @@ -123,6 +121,9 @@ int mdiobus_register(struct mii_bus *bus) } } + if (!err) + bus->state = MDIOBUS_REGISTERED; + pr_info("%s: probed\n", bus->name); return err;
kernel BUG at drivers/net/phy/mdio_bus.c:165! Unable to handle kernel NULL pointer dereference at virtual address 00000000 How? mdiobus_alloc() sets bus->state = MDIOBUS_ALLOCATED. mdiobus_register() sets bus->state = MDIOBUS_REGISTERED but then can fail (mdiobus_scan()) returning an error to the caller. The caller aborts correctly with mdiobus_free() which does: if (bus->state == MDIOBUS_ALLOCATED) { kfree(bus); return; } BUG_ON(bus->state != MDIOBUS_UNREGISTERED); Signed-off-by: Krzysztof Halasa <khc@pm.waw.pl>