diff --git a/src/add-ons/kernel/file_systems/ext2/Volume.cpp b/src/add-ons/kernel/file_systems/ext2/Volume.cpp index 629cec7dc6..3b5925186a 100644 --- a/src/add-ons/kernel/file_systems/ext2/Volume.cpp +++ b/src/add-ons/kernel/file_systems/ext2/Volume.cpp @@ -202,9 +202,21 @@ DeviceOpener::GetSize(off_t* _size, uint32* _blockSize) bool ext2_super_block::IsValid() { - // TODO: check some more values! - if (Magic() != (uint32)EXT2_SUPER_BLOCK_MAGIC) + if (Magic() != (uint32)EXT2_SUPER_BLOCK_MAGIC + || BlockShift() > 16 + || BlocksPerGroup() != (1UL << BlockShift()) * 8 + || InodeSize() > (1UL << BlockShift()) + || RevisionLevel() > EXT2_MAX_REVISION + || ReservedGDTBlocks() > (1UL << BlockShift()) / 4) return false; + if (Has64bitFeature()) { + if (GroupDescriptorSize() > EXT2_BLOCK_GROUP_64BIT_SIZE || GroupDescriptorSize() < EXT2_BLOCK_GROUP_NORMAL_SIZE) + return false; + } + else { + if (GroupDescriptorSize() != EXT2_BLOCK_GROUP_NORMAL_SIZE) + return false; + } return true; } diff --git a/src/add-ons/kernel/file_systems/ext2/ext2.h b/src/add-ons/kernel/file_systems/ext2/ext2.h index 2bc5f7fc29..2e7479e7fa 100644 --- a/src/add-ons/kernel/file_systems/ext2/ext2.h +++ b/src/add-ons/kernel/file_systems/ext2/ext2.h @@ -194,6 +194,7 @@ struct ext2_super_block { #define EXT2_STATE_INVALID 0x02 #define EXT2_BLOCK_GROUP_NORMAL_SIZE 32 +#define EXT2_BLOCK_GROUP_64BIT_SIZE 64 // block group flags #define EXT2_BLOCK_GROUP_INODE_UNINIT 0x1