Ext2FS: Fix bitmap overrun when reaching outside the first block group.

This commit is contained in:
Andreas Kling 2019-02-08 17:14:51 +01:00
parent a6f9ddbb58
commit 6274208eb9
Notes: sideshowbarker 2024-07-19 15:49:15 +09:00

View file

@ -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);