DragonFlyBSD Kernel Audit
DF-0875 / fix.diff
← back to finding ↓ download raw
diff --git a/sys/vfs/hammer2/hammer2_ondisk.c b/sys/vfs/hammer2/hammer2_ondisk.c
--- a/sys/vfs/hammer2/hammer2_ondisk.c
+++ b/sys/vfs/hammer2/hammer2_ondisk.c
@@ -728,10 +728,12 @@
 	}
 	//hammer2_voldata_unlock(hmp);
 
-	if (!ret)
-		panic("no volume for offset 0x%016jx", (intmax_t)offset);
+	if (ret == NULL) {
+		kprintf("hammer2_get_volume: no volume for offset 0x%016jx\n",
+			(intmax_t)offset);
+		return NULL;
+	}
 
-	KKASSERT(ret);
 	KKASSERT(ret->dev);
 	KKASSERT(ret->dev->devvp);
 	KKASSERT(ret->dev->path);
diff --git a/sys/vfs/hammer2/hammer2_io.c b/sys/vfs/hammer2/hammer2_io.c
--- a/sys/vfs/hammer2/hammer2_io.c
+++ b/sys/vfs/hammer2/hammer2_io.c
@@ -140,6 +140,10 @@
 	} else if (createit) {
 		refs = 0;
 		vol = hammer2_get_volume(hmp, pbase);
+		if (vol == NULL) {
+			*isgoodp = 0;
+			return NULL;
+		}
 		dio = kmalloc_obj(sizeof(*dio), hmp->mio, M_INTWAIT | M_ZERO);
 		dio->hmp = hmp;
 		dio->devvp = vol->dev->devvp;
@@ -199,6 +203,8 @@
 		op = HAMMER2_DOP_READ;
 	} else {
 		dio = hammer2_io_alloc(hmp, lbase, btype, 1, &isgood);
+		if (dio == NULL)
+			return NULL;
 	}
 
 	for (;;) {
@@ -398,6 +404,8 @@
 
 	dio = *diop;
 	*diop = NULL;
+	if (dio == NULL)
+		return;
 	hmp = dio->hmp;
 	DIO_RECORD(dio HAMMER2_IO_DEBUG_CALL);
 
@@ -571,6 +579,8 @@
 	       hammer2_io_t **diop)
 {
 	*diop = hammer2_io_getblk(hmp, btype, lbase, lsize, HAMMER2_DOP_NEW);
+	if (*diop == NULL)
+		return EIO;
 	return ((*diop)->error);
 }
 
@@ -579,6 +589,8 @@
 		 hammer2_io_t **diop)
 {
 	*diop = hammer2_io_getblk(hmp, btype, lbase, lsize, HAMMER2_DOP_NEWNZ);
+	if (*diop == NULL)
+		return EIO;
 	return ((*diop)->error);
 }
 
@@ -600,6 +612,8 @@
 #endif
 	}
 #endif
+	if (*diop == NULL)
+		return EIO;
 	return ((*diop)->error);
 }