Denis Kirjanov 08e620
From ac61259087693b21e6cfdb76a4beabed70542db1 Mon Sep 17 00:00:00 2001
Denis Kirjanov 08e620
From: Pavel Skripkin <paskripkin@gmail.com>
Denis Kirjanov 08e620
Date: Fri, 18 Jun 2021 16:49:02 +0300
Denis Kirjanov 08e620
Subject: [PATCH 12/16] net: ethernet: fix potential use-after-free in
Denis Kirjanov 08e620
 ec_bhf_remove
Denis Kirjanov 08e620
Git-commit: 9cca0c2d70149160407bda9a9446ce0c29b6e6c6
Denis Kirjanov 08e620
Patch-mainline: v5.13-rc7
Denis Kirjanov 08e620
References: git-fixes
Denis Kirjanov 08e620
Denis Kirjanov 08e620
static void ec_bhf_remove(struct pci_dev *dev)
Denis Kirjanov 08e620
{
Denis Kirjanov 08e620
...
Denis Kirjanov 08e620
	struct ec_bhf_priv *priv = netdev_priv(net_dev);
Denis Kirjanov 08e620
Denis Kirjanov 08e620
	unregister_netdev(net_dev);
Denis Kirjanov 08e620
	free_netdev(net_dev);
Denis Kirjanov 08e620
Denis Kirjanov 08e620
	pci_iounmap(dev, priv->dma_io);
Denis Kirjanov 08e620
	pci_iounmap(dev, priv->io);
Denis Kirjanov 08e620
...
Denis Kirjanov 08e620
}
Denis Kirjanov 08e620
Denis Kirjanov 08e620
priv is netdev private data, but it is used
Denis Kirjanov 08e620
after free_netdev(). It can cause use-after-free when accessing priv
Denis Kirjanov 08e620
pointer. So, fix it by moving free_netdev() after pci_iounmap()
Denis Kirjanov 08e620
calls.
Denis Kirjanov 08e620
Denis Kirjanov 08e620
Fixes: 6af55ff52b02 ("Driver for Beckhoff CX5020 EtherCAT master module.")
Denis Kirjanov 08e620
Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
Denis Kirjanov 08e620
Signed-off-by: David S. Miller <davem@davemloft.net>
Denis Kirjanov 08e620
Signed-off-by: Denis Kirjanov <denis.kirjanov@suse.com>
Denis Kirjanov 08e620
---
Denis Kirjanov 08e620
 drivers/net/ethernet/ec_bhf.c | 4 +++-
Denis Kirjanov 08e620
 1 file changed, 3 insertions(+), 1 deletion(-)
Denis Kirjanov 08e620
Denis Kirjanov 08e620
diff --git a/drivers/net/ethernet/ec_bhf.c b/drivers/net/ethernet/ec_bhf.c
Denis Kirjanov 08e620
index b513c99d003b..8f2bc372ed89 100644
Denis Kirjanov 08e620
--- a/drivers/net/ethernet/ec_bhf.c
Denis Kirjanov 08e620
+++ b/drivers/net/ethernet/ec_bhf.c
Denis Kirjanov 08e620
@@ -585,10 +585,12 @@ static void ec_bhf_remove(struct pci_dev *dev)
Denis Kirjanov 08e620
 	struct ec_bhf_priv *priv = netdev_priv(net_dev);
Denis Kirjanov 08e620
 
Denis Kirjanov 08e620
 	unregister_netdev(net_dev);
Denis Kirjanov 08e620
-	free_netdev(net_dev);
Denis Kirjanov 08e620
 
Denis Kirjanov 08e620
 	pci_iounmap(dev, priv->dma_io);
Denis Kirjanov 08e620
 	pci_iounmap(dev, priv->io);
Denis Kirjanov 08e620
+
Denis Kirjanov 08e620
+	free_netdev(net_dev);
Denis Kirjanov 08e620
+
Denis Kirjanov 08e620
 	pci_release_regions(dev);
Denis Kirjanov 08e620
 	pci_clear_master(dev);
Denis Kirjanov 08e620
 	pci_disable_device(dev);
Denis Kirjanov 08e620
-- 
Denis Kirjanov 08e620
2.16.4
Denis Kirjanov 08e620