DF-0867 / fix.diff
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(). */ |