[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20230420140157.22416-1-duoming@zju.edu.cn>
Date: Thu, 20 Apr 2023 22:01:57 +0800
From: Duoming Zhou <duoming@....edu.cn>
To: netdev@...r.kernel.org
Cc: linux-kernel@...r.kernel.org, jesse.brandeburg@...el.com,
anthony.l.nguyen@...el.com, davem@...emloft.net,
edumazet@...gle.com, kuba@...nel.org, pabeni@...hat.com,
intel-wired-lan@...ts.osuosl.org, Duoming Zhou <duoming@....edu.cn>
Subject: [PATCH net] ethernet: ixgb: fix use after free bugs caused by circular dependency problem
The watchdog_timer can schedule tx_timeout_task and tx_timeout_task
can also arm watchdog_timer. The process is shown below:
----------- timer schedules work ------------
ixgb_watchdog() //timer handler
schedule_work(&adapter->tx_timeout_task)
----------- work arms timer ------------
ixgb_tx_timeout_task() //workqueue callback function
ixgb_up()
mod_timer(&adapter->watchdog_timer,...)
When ixgb device is detaching, the timer and workqueue
could still be rearmed. The process is shown below:
(cleanup routine) | (timer and workqueue routine)
ixgb_remove() |
| ixgb_tx_timeout_task() //workqueue
| ixgb_up()
| mod_timer()
cancel_work_sync() |
free_netdev(netdev) //FREE | ixgb_watchdog() //timer
| netif_carrier_ok(netdev) //USE
This patch adds timer_shutdown_sync() in ixgb_remove(), which
could prevent rearming of the timer from the workqueue.
Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
Signed-off-by: Duoming Zhou <duoming@....edu.cn>
---
drivers/net/ethernet/intel/ixgb/ixgb_main.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/net/ethernet/intel/ixgb/ixgb_main.c b/drivers/net/ethernet/intel/ixgb/ixgb_main.c
index b4d47e7a76c..6ce3601904b 100644
--- a/drivers/net/ethernet/intel/ixgb/ixgb_main.c
+++ b/drivers/net/ethernet/intel/ixgb/ixgb_main.c
@@ -516,6 +516,7 @@ ixgb_remove(struct pci_dev *pdev)
struct net_device *netdev = pci_get_drvdata(pdev);
struct ixgb_adapter *adapter = netdev_priv(netdev);
+ timer_shutdown_sync(&adapter->watchdog_timer);
cancel_work_sync(&adapter->tx_timeout_task);
unregister_netdev(netdev);
--
2.17.1
Powered by blists - more mailing lists