⬢ DragonFlyBSD Kernel Audit
DF-2939 / fix.diff
← back to finding ↓ download raw
--- a/sys/vm/device_pager.c
+++ b/sys/vm/device_pager.c
@@ -212,6 +212,12 @@
 
 	mtx_lock(&dev_pager_mtx);
 	TAILQ_REMOVE(&dev_pager_object_list, object, pager_object_entry);
+	if (object->un_pager.devp.ops->cdev_pg_ctor == old_dev_pager_ctor) {
+		cdev_t odev = object->un_pager.devp.dev;
+
+		if (odev != NULL && odev->si_object == object)
+			odev->si_object = NULL;
+	}
 	mtx_unlock(&dev_pager_mtx);
 
 	if (object->type == OBJT_DEVICE) {
@@ -336,13 +342,8 @@
 
 static void old_dev_pager_dtor(void *handle)
 {
-	cdev_t dev;
-
-	dev = handle;
-	if (dev != NULL) {
-		KKASSERT(dev->si_object);
-		dev->si_object = NULL;
-	}
+	/* si_object bookkeeping moved under dev_pager_mtx in
+	 * dev_pager_dealloc() after the object is unlinked. */
 }
 
 static int