⬢ DragonFlyBSD Kernel Audit
DF-4478 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/raid/vinum/vinumioctl.c
+++ b/sys/dev/raid/vinum/vinumioctl.c
@@ -226,7 +226,10 @@
 	    }
 
 	case VINUM_SETSTATE:
-	    setstate((struct vinum_ioctl_msg *) data);	    /* set an object state */
+	    if ((error = lock_config()) == 0) {		    /* DF-4478 */
+		setstate((struct vinum_ioctl_msg *) data);    /* set an object state */
+		unlock_config();
+	    }
 	    break;
 
 	    /*
@@ -234,7 +237,10 @@
 	     * anything else.
 	     */
 	case VINUM_SETSTATE_FORCE:
-	    setstate_by_force((struct vinum_ioctl_msg *) data);	/* set an object state */
+	    if ((error = lock_config()) == 0) {		    /* DF-4478 */
+		setstate_by_force((struct vinum_ioctl_msg *) data);
+		unlock_config();
+	    }
 	    break;
 
 #ifdef VINUMDEBUG
@@ -270,17 +276,26 @@
 	    break;
 
 	case VINUM_RESETSTATS:
-	    resetstats((struct vinum_ioctl_msg *) data);    /* reset object stats */
+	    if ((error = lock_config()) == 0) {		    /* DF-4478 */
+		resetstats((struct vinum_ioctl_msg *) data);
+		unlock_config();
+	    }    /* reset object stats */
 	    break;
 
 	    /* attach an object to a superordinate object */
 	case VINUM_ATTACH:
-	    attachobject((struct vinum_ioctl_msg *) data);
+	    if ((error = lock_config()) == 0) {		    /* DF-4478 */
+		attachobject((struct vinum_ioctl_msg *) data);
+		unlock_config();
+	    }
 	    break;
 
 	    /* detach an object from a superordinate object */
 	case VINUM_DETACH:
-	    detachobject((struct vinum_ioctl_msg *) data);
+	    if ((error = lock_config()) == 0) {		    /* DF-4478 */
+		detachobject((struct vinum_ioctl_msg *) data);
+		unlock_config();
+	    }
 	    break;
 
 	    /* rename an object */