aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwangxingdsb <wangxindsb@gmail.com>2017-03-28 08:34:54 -0700
committerAdrien Destugues <pulkomandy@pulkomandy.tk>2017-03-30 07:31:29 +0200
commitc8a27537a747fdac8efe6cbcb5b7013ca56ab5b2 (patch)
treee77416f3b5eae7627fafa26ebe0fa33bf1c4a0aa
parent2ff144d005eca1da09f714f56248396dfecb9b30 (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.cpp16
-rw-r--r--src/add-ons/kernel/file_systems/ext2/ext2.h1
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