Skip to content

Commit 6b6bc5b

Browse files
bluesheep1337davem330
authored andcommitted
net: qcom/emac: Fix use after free bug in emac_remove due to race condition
In emac_probe, &adpt->work_thread is bound with emac_work_thread. Then it will be started by timeout handler emac_tx_timeout or a IRQ handler emac_isr. If we remove the driver which will call emac_remove to make cleanup, there may be a unfinished work. The possible sequence is as follows: Fix it by finishing the work before cleanup in the emac_remove and disable timeout response. CPU0 CPU1 |emac_work_thread emac_remove | free_netdev | kfree(netdev); | |emac_reinit_locked |emac_mac_down |//use netdev Fixes: b9b17de ("net: emac: emac gigabit ethernet controller driver") Signed-off-by: Zheng Wang <zyytlz.wz@163.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent a8eff03 commit 6b6bc5b

File tree

1 file changed

+6
-0
lines changed
  • drivers/net/ethernet/qualcomm/emac

1 file changed

+6
-0
lines changed

drivers/net/ethernet/qualcomm/emac/emac.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -724,9 +724,15 @@ static int emac_remove(struct platform_device *pdev)
724724
struct net_device *netdev = dev_get_drvdata(&pdev->dev);
725725
struct emac_adapter *adpt = netdev_priv(netdev);
726726

727+
netif_carrier_off(netdev);
728+
netif_tx_disable(netdev);
729+
727730
unregister_netdev(netdev);
728731
netif_napi_del(&adpt->rx_q.napi);
729732

733+
free_irq(adpt->irq.irq, &adpt->irq);
734+
cancel_work_sync(&adpt->work_thread);
735+
730736
emac_clks_teardown(adpt);
731737

732738
put_device(&adpt->phydev->mdio.dev);

0 commit comments

Comments
 (0)