⬢ DragonFlyBSD Kernel Audit
DF-4707 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/raid/amr/amrvar.h
+++ b/sys/dev/raid/amr/amrvar.h
@@ -216,6 +216,7 @@
     /* controller state */
     int				amr_state;
+    int				amr_opencnt;		/* open descriptors on amr_dev_t */
 #define AMR_STATE_OPEN		(1<<0)
 #define AMR_STATE_SUSPEND	(1<<1)
--- a/sys/dev/raid/amr/amr.c
+++ b/sys/dev/raid/amr/amr.c
@@ -428,6 +428,7 @@ amr_open(struct dev_open_args *ap)
     debug_called(1);
 
     sc->amr_state |= AMR_STATE_OPEN;
+    sc->amr_opencnt++;
     return(0);
 }
@@ -443,6 +444,9 @@ amr_close(struct dev_close_args *ap)
     debug_called(1);
 
+    KKASSERT(sc->amr_opencnt > 0);
+    if (--sc->amr_opencnt == 0)
     sc->amr_state &= ~AMR_STATE_OPEN;
     return (0);
 }
--- a/sys/dev/raid/amr/amr_pci.c
+++ b/sys/dev/raid/amr/amr_pci.c
@@ -362,7 +362,8 @@ amr_pci_detach(device_t dev)
 
     debug_called(1);
 
-    if (sc->amr_state & AMR_STATE_OPEN)
+    if ((sc->amr_state & AMR_STATE_OPEN) || sc->amr_opencnt > 0)
 	return(EBUSY);