Commit 04aa1bc4 authored by Bruno Carneiro da Cunha's avatar Bruno Carneiro da Cunha Committed by David S. Miller

lpc_eth: kernel BUG on remove

We may have found a bug in the nxp/lpc_eth.c driver. The function
platform_set_drvdata() is called twice, the second time it is called,
in lpc_mii_init(), it overwrites the struct net_device which should be
at pdev->dev->driver_data with pldat->mii_bus. When trying to remove
the driver, in lpc_eth_drv_remove(), platform_get_drvdata() will
return the pldat->mii_bus pointer and try to use it as a struct
net_device pointer. This causes unregister_netdev to segfault and
generate a kernel BUG. Is this reproducible?
Signed-off-by: default avatarDaniel Martinez <linux@danielsmartinez.com>
Signed-off-by: default avatarBruno Carneiro da Cunha <brunocarneirodacunha@usp.br>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 9424e2e7
...@@ -817,8 +817,6 @@ static int lpc_mii_init(struct netdata_local *pldat) ...@@ -817,8 +817,6 @@ static int lpc_mii_init(struct netdata_local *pldat)
pldat->mii_bus->priv = pldat; pldat->mii_bus->priv = pldat;
pldat->mii_bus->parent = &pldat->pdev->dev; pldat->mii_bus->parent = &pldat->pdev->dev;
platform_set_drvdata(pldat->pdev, pldat->mii_bus);
node = of_get_child_by_name(pldat->pdev->dev.of_node, "mdio"); node = of_get_child_by_name(pldat->pdev->dev.of_node, "mdio");
err = of_mdiobus_register(pldat->mii_bus, node); err = of_mdiobus_register(pldat->mii_bus, node);
of_node_put(node); of_node_put(node);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment