DragonFlyBSD Kernel Audit
DF-2058 / fix.diff
← back to finding ↓ download raw
diff --git a/sys/dev/disk/dm/dm_pdev.c b/sys/dev/disk/dm/dm_pdev.c
--- a/sys/dev/disk/dm/dm_pdev.c
+++ b/sys/dev/disk/dm/dm_pdev.c
@@ -165,18 +165,21 @@
 	 * dumps.
 	 */
 	bzero(&dmp->pdev_pinfo, sizeof(dmp->pdev_pinfo));
-	error = dev_dioctl(dmp->pdev_vnode->v_rdev, DIOCGPART,
-	    (void *)&dmp->pdev_pinfo, 0, proc0.p_ucred, NULL, NULL);
-	if (!error) {
-		struct partinfo *dpart = &dmp->pdev_pinfo;
-		dmdebug("DIOCGPART offset=%ju size=%ju blocks=%ju blksize=%d\n",
-			dpart->media_offset,
-			dpart->media_size,
-			dpart->media_blocks,
-			dpart->media_blksize);
-	} else {
-		kprintf("dmp_pdev_insert DIOCGPART failed %d\n", error);
-	}
+	error = dev_dioctl(dmp->pdev_vnode->v_rdev, DIOCGPART,
+	    (void *)&dmp->pdev_pinfo, 0, proc0.p_ucred, NULL, NULL);
+	if (!error) {
+		struct partinfo *dpart = &dmp->pdev_pinfo;
+		dmdebug("DIOCGPART offset=%ju size=%ju blocks=%ju blksize=%d\n",
+			dpart->media_offset,
+			dpart->media_size,
+			dpart->media_blocks,
+			dpart->media_blksize);
+	} else {
+		kprintf("dmp_pdev_insert DIOCGPART failed %d\n", error);
+		dm_pdev_free(dmp);
+		lockmgr(&dm_pdev_mutex, LK_RELEASE);
+		return NULL;
+	}
 
 	TAILQ_INSERT_TAIL(&dm_pdev_list, dmp, next_pdev);
 	lockmgr(&dm_pdev_mutex, LK_RELEASE);