DragonFlyBSD Kernel Audit
DF-1687 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/agp/agppriv.h
+++ b/sys/dev/agp/agppriv.h
@@ -75,6 +75,7 @@
 	struct agp_memory_list	as_memory;	/* list of allocated memory */
 	int			as_nextid;	/* next memory block id */
 	int			as_isopen;	/* user device is open */
+	int			as_opencount;	/* open reference count */
 	struct cdev		*as_devnode;	/* from make_dev */
 	struct lock		as_lock;	/* lock for access to GATT */
 };
--- a/sys/dev/agp/agp.c
+++ b/sys/dev/agp/agp.c
@@ -778,6 +778,8 @@
 	device_t dev = kdev->si_drv1;
 	struct agp_softc *sc = device_get_softc(dev);
 
+	lockmgr(&sc->as_lock, LK_EXCLUSIVE);
+	sc->as_opencount++;
 	if (!sc->as_isopen) {
 		sc->as_isopen = 1;
 		device_busy(dev);
@@ -808,6 +810,7 @@
 		sc->as_isopen = 0;
 		device_unbusy(dev);
 	}
+	lockmgr(&sc->as_lock, LK_RELEASE);
 
 	return 0;
 }