From 6274208eb96912fbcd27f189a070edcb1d1e713d Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Fri, 8 Feb 2019 17:14:51 +0100 Subject: [PATCH] Ext2FS: Fix bitmap overrun when reaching outside the first block group. --- Kernel/Ext2FileSystem.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Kernel/Ext2FileSystem.cpp b/Kernel/Ext2FileSystem.cpp index 4861d1311f..e3bf0fd6f0 100644 --- a/Kernel/Ext2FileSystem.cpp +++ b/Kernel/Ext2FileSystem.cpp @@ -929,9 +929,10 @@ bool Ext2FS::get_inode_allocation_state(InodeIndex index) const if (index == 0) return true; auto& bgd = group_descriptor(group_index_from_inode(index)); + unsigned index_in_group = index % inodes_per_group(); unsigned inodes_per_bitmap_block = block_size() * 8; - unsigned bitmap_block_index = (index - 1) / inodes_per_bitmap_block; - unsigned bit_index = (index - 1) % inodes_per_bitmap_block; + unsigned bitmap_block_index = (index_in_group - 1) / inodes_per_bitmap_block; + unsigned bit_index = (index_in_group - 1) % inodes_per_bitmap_block; auto block = read_block(bgd.bg_inode_bitmap + bitmap_block_index); ASSERT(block); auto bitmap = Bitmap::wrap(block.pointer(), inodes_per_bitmap_block); @@ -941,11 +942,10 @@ bool Ext2FS::get_inode_allocation_state(InodeIndex index) const bool Ext2FS::set_inode_allocation_state(unsigned index, bool newState) { auto& bgd = group_descriptor(group_index_from_inode(index)); - - // Update inode bitmap + unsigned index_in_group = index % inodes_per_group(); unsigned inodes_per_bitmap_block = block_size() * 8; - unsigned bitmap_block_index = (index - 1) / inodes_per_bitmap_block; - unsigned bit_index = (index - 1) % inodes_per_bitmap_block; + unsigned bitmap_block_index = (index_in_group - 1) / inodes_per_bitmap_block; + unsigned bit_index = (index_in_group - 1) % inodes_per_bitmap_block; auto block = read_block(bgd.bg_inode_bitmap + bitmap_block_index); ASSERT(block); auto bitmap = Bitmap::wrap(block.pointer(), inodes_per_bitmap_block);