diff options
| author | wangxingdsb <wangxindsb@gmail.com> | 2017-03-28 08:34:54 -0700 |
|---|---|---|
| committer | Adrien Destugues <pulkomandy@pulkomandy.tk> | 2017-03-30 07:31:29 +0200 |
| commit | c8a27537a747fdac8efe6cbcb5b7013ca56ab5b2 (patch) | |
| tree | e77416f3b5eae7627fafa26ebe0fa33bf1c4a0aa | |
| parent | 2ff144d005eca1da09f714f56248396dfecb9b30 (diff) | |
ext2: check some more values for ext2_super_blockhrev51052
Signed-off-by: Adrien Destugues <pulkomandy@pulkomandy.tk>
Fixes #13401.
| -rw-r--r-- | src/add-ons/kernel/file_systems/ext2/Volume.cpp | 16 | ||||
| -rw-r--r-- | src/add-ons/kernel/file_systems/ext2/ext2.h | 1 |
2 files changed, 15 insertions, 2 deletions
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 |
