DragonFlyBSD Kernel Audit
DF-1068 / fix.diff
← back to finding ↓ download raw
diff --git a/sys/bus/pci/pci_user.c b/sys/bus/pci/pci_user.c
--- a/sys/bus/pci/pci_user.c
+++ b/sys/bus/pci/pci_user.c
@@ -56,7 +56,7 @@
 /*
  * This is the user interface to PCI configuration space.
  */
-static struct lwkt_token pci_token = LWKT_TOKEN_INITIALIZER(pci_token);
+struct lwkt_token pci_token = LWKT_TOKEN_INITIALIZER(pci_token);
 
 static d_open_t 	pci_open;
 static d_close_t	pci_close;

diff --git a/sys/bus/pci/pci.c b/sys/bus/pci/pci.c
--- a/sys/bus/pci/pci.c
+++ b/sys/bus/pci/pci.c
@@ -53,6 +53,7 @@
 #include <sys/rman.h>
 #include <sys/device.h>
 
+#include <sys/thread.h>
 #include <sys/pciio.h>
 #include <bus/pci/pcireg.h>
 #include <bus/pci/pcivar.h>
@@ -69,6 +70,8 @@
 #include "pcib_if.h"
 #include "pci_if.h"
 
+extern struct lwkt_token pci_token;
+
 typedef void	(*pci_read_cap_t)(device_t, int, int, pcicfgregs *);
 
 static uint32_t		pci_mapbase(unsigned mapreg);
@@ -2152,8 +2155,10 @@
 			kfree(dinfo->cfg.vpd.vpd_w[i].value, M_DEVBUF);
 		kfree(dinfo->cfg.vpd.vpd_w, M_DEVBUF);
 	}
+	lwkt_gettoken(&pci_token);
 	STAILQ_REMOVE(devlist_head, dinfo, pci_devinfo, pci_links);
 	kfree(dinfo, M_DEVBUF);
+	lwkt_reltoken(&pci_token);
 
 	/* increment the generation count */
 	pci_generation++;