DragonFlyBSD Kernel Audit
DF-0867 / fix.diff
← back to finding ↓ download raw
diff --git a/sys/vfs/hammer/hammer_mirror.c b/sys/vfs/hammer/hammer_mirror.c
--- a/sys/vfs/hammer/hammer_mirror.c
+++ b/sys/vfs/hammer/hammer_mirror.c
@@ -579,6 +579,26 @@
 	}
 
 	/*
+	 * Validate rec_type.  The mirror stream is attacker-controlled and
+	 * hammer_alloc_data() panics on record types outside its switch()
+	 * (see hammer_ondisk.c).  Only allow types the allocator can handle.
+	 */
+	switch(mrec->leaf.base.rec_type) {
+	case HAMMER_RECTYPE_INODE:
+	case HAMMER_RECTYPE_DATA:
+	case HAMMER_RECTYPE_DIRENTRY:
+	case HAMMER_RECTYPE_DB:
+	case HAMMER_RECTYPE_EXT:
+	case HAMMER_RECTYPE_FIX:
+	case HAMMER_RECTYPE_PFS:
+	case HAMMER_RECTYPE_SNAPSHOT:
+	case HAMMER_RECTYPE_CONFIG:
+		break;
+	default:
+		return(EINVAL);
+	}
+
+	/*
 	 * Re-localize for target.  relocalization of data is handled
 	 * by hammer_create_at_cursor().
 	 */