e2fsprogs/e2fsprogs-1.39-group_desc_loops.patch

320 lines
12 KiB
Diff
Raw Normal View History

# HG changeset patch
# User tytso@mit.edu
# Date Tue Sep 12 14:55:22 2006 -0400
# Node ID 90cd01f7fcd6293846f0b3ca6ce2b007e3dd7d51
# parent: cb841a8195a7aa87e8d0c95686291e8fb53358df
Fix loops over group descriptors to prevent 2**32-1 block number overflows
For loops iterating over all group descriptors, consistently define
first_block and last_block in a way that they are inclusive of the
range, and do not overflow.
Previously on the last block group we did a test of <= first +
dec_blocks; this would actually wrap back to 0 for a total block count
of 2^32-1
Also add handling of last block group which may be smaller.
Signed-off-by: Eric Sandeen <esandeen@redhat.com>
Index: e2fsprogs-1.39-my-patches-from-ted/e2fsck/ChangeLog
===================================================================
--- e2fsprogs-1.39-my-patches-from-ted.orig/e2fsck/ChangeLog
+++ e2fsprogs-1.39-my-patches-from-ted/e2fsck/ChangeLog
@@ -1,3 +1,11 @@
+2006-08-30 Eric Sandeen <esandeen@redhat.com>
+
+ * pass1b.c (check_if_fs_block): Change block group loop to use
+ a common pattern of first_block/last_block, etc.
+
+ * super.c (check_super_block): Avoid overflows when iterating over
+ group descriptors on very large filesystems
+
2006-08-30 Theodore Tso <tytso@mit.edu>
* pass5.c (check_inode_bitmaps, check_inode_end, check_block_end):
Index: e2fsprogs-1.39-my-patches-from-ted/e2fsck/pass1b.c
===================================================================
--- e2fsprogs-1.39-my-patches-from-ted.orig/e2fsck/pass1b.c
+++ e2fsprogs-1.39-my-patches-from-ted/e2fsck/pass1b.c
@@ -779,16 +779,16 @@ errout:
static int check_if_fs_block(e2fsck_t ctx, blk_t test_block)
{
ext2_filsys fs = ctx->fs;
- blk_t block;
+ blk_t first_block;
dgrp_t i;
- block = fs->super->s_first_data_block;
+ first_block = fs->super->s_first_data_block;
for (i = 0; i < fs->group_desc_count; i++) {
- /* Check superblocks/block group descriptros */
+ /* Check superblocks/block group descriptors */
if (ext2fs_bg_has_super(fs, i)) {
- if (test_block >= block &&
- (test_block <= block + fs->desc_blocks))
+ if (test_block >= first_block &&
+ (test_block <= first_block + fs->desc_blocks))
return 1;
}
@@ -804,7 +804,7 @@ static int check_if_fs_block(e2fsck_t ct
(test_block == fs->group_desc[i].bg_inode_bitmap))
return 1;
- block += fs->super->s_blocks_per_group;
+ first_block += fs->super->s_blocks_per_group;
}
return 0;
}
Index: e2fsprogs-1.39-my-patches-from-ted/e2fsck/super.c
===================================================================
--- e2fsprogs-1.39-my-patches-from-ted.orig/e2fsck/super.c
+++ e2fsprogs-1.39-my-patches-from-ted/e2fsck/super.c
@@ -566,15 +566,17 @@ void check_super_block(e2fsck_t ctx)
* Verify the group descriptors....
*/
first_block = sb->s_first_data_block;
- last_block = first_block + blocks_per_group;
for (i = 0, gd=fs->group_desc; i < fs->group_desc_count; i++, gd++) {
pctx.group = i;
if (i == fs->group_desc_count - 1)
- last_block = sb->s_blocks_count;
+ last_block = sb->s_blocks_count - 1;
+ else
+ last_block = first_block + blocks_per_group - 1;
+
if ((gd->bg_block_bitmap < first_block) ||
- (gd->bg_block_bitmap >= last_block)) {
+ (gd->bg_block_bitmap > last_block)) {
pctx.blk = gd->bg_block_bitmap;
if (fix_problem(ctx, PR_0_BB_NOT_GROUP, &pctx))
gd->bg_block_bitmap = 0;
@@ -584,7 +586,7 @@ void check_super_block(e2fsck_t ctx)
ctx->invalid_bitmaps++;
}
if ((gd->bg_inode_bitmap < first_block) ||
- (gd->bg_inode_bitmap >= last_block)) {
+ (gd->bg_inode_bitmap > last_block)) {
pctx.blk = gd->bg_inode_bitmap;
if (fix_problem(ctx, PR_0_IB_NOT_GROUP, &pctx))
gd->bg_inode_bitmap = 0;
@@ -595,7 +597,7 @@ void check_super_block(e2fsck_t ctx)
}
if ((gd->bg_inode_table < first_block) ||
((gd->bg_inode_table +
- fs->inode_blocks_per_group - 1) >= last_block)) {
+ fs->inode_blocks_per_group - 1) > last_block)) {
pctx.blk = gd->bg_inode_table;
if (fix_problem(ctx, PR_0_ITABLE_NOT_GROUP, &pctx))
gd->bg_inode_table = 0;
@@ -607,7 +609,6 @@ void check_super_block(e2fsck_t ctx)
free_blocks += gd->bg_free_blocks_count;
free_inodes += gd->bg_free_inodes_count;
first_block += sb->s_blocks_per_group;
- last_block += sb->s_blocks_per_group;
if ((gd->bg_free_blocks_count > sb->s_blocks_per_group) ||
(gd->bg_free_inodes_count > sb->s_inodes_per_group) ||
Index: e2fsprogs-1.39-my-patches-from-ted/lib/ext2fs/ChangeLog
===================================================================
--- e2fsprogs-1.39-my-patches-from-ted.orig/lib/ext2fs/ChangeLog
+++ e2fsprogs-1.39-my-patches-from-ted/lib/ext2fs/ChangeLog
@@ -1,3 +1,8 @@
+2006-08-30 Eric Sandeen <esandeen@redhat.com>
+
+ * check_desc.c (ext2fs_check_desc): avoid overflows when iterating
+ over group descriptors on very large filesystems.
+
2006-08-30 Theodore Tso <tytso@mit.edu>
* bitmaps.c (ext2fs_set_bitmap_padding): Fix potential overflow
Index: e2fsprogs-1.39-my-patches-from-ted/lib/ext2fs/check_desc.c
===================================================================
--- e2fsprogs-1.39-my-patches-from-ted.orig/lib/ext2fs/check_desc.c
+++ e2fsprogs-1.39-my-patches-from-ted/lib/ext2fs/check_desc.c
@@ -32,37 +32,41 @@
errcode_t ext2fs_check_desc(ext2_filsys fs)
{
dgrp_t i;
- blk_t block = fs->super->s_first_data_block;
- blk_t next;
+ blk_t first_block = fs->super->s_first_data_block;
+ blk_t last_block;
EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS);
for (i = 0; i < fs->group_desc_count; i++) {
- next = block + fs->super->s_blocks_per_group;
+ if (i == fs->group_desc_count - 1)
+ last_block = fs->super->s_blocks_count - 1;
+ else
+ last_block = first_block +
+ fs->super->s_blocks_per_group - 1;
/*
* Check to make sure block bitmap for group is
* located within the group.
*/
- if (fs->group_desc[i].bg_block_bitmap < block ||
- fs->group_desc[i].bg_block_bitmap >= next)
+ if (fs->group_desc[i].bg_block_bitmap < first_block ||
+ fs->group_desc[i].bg_block_bitmap > last_block)
return EXT2_ET_GDESC_BAD_BLOCK_MAP;
/*
* Check to make sure inode bitmap for group is
* located within the group
*/
- if (fs->group_desc[i].bg_inode_bitmap < block ||
- fs->group_desc[i].bg_inode_bitmap >= next)
+ if (fs->group_desc[i].bg_inode_bitmap < first_block ||
+ fs->group_desc[i].bg_inode_bitmap > last_block)
return EXT2_ET_GDESC_BAD_INODE_MAP;
/*
* Check to make sure inode table for group is located
* within the group
*/
- if (fs->group_desc[i].bg_inode_table < block ||
+ if (fs->group_desc[i].bg_inode_table < first_block ||
((fs->group_desc[i].bg_inode_table +
- fs->inode_blocks_per_group) >= next))
+ fs->inode_blocks_per_group) > last_block))
return EXT2_ET_GDESC_BAD_INODE_TABLE;
- block = next;
+ first_block += fs->super->s_blocks_per_group;
}
return 0;
}
Index: e2fsprogs-1.39-my-patches-from-ted/misc/ChangeLog
===================================================================
--- e2fsprogs-1.39-my-patches-from-ted.orig/misc/ChangeLog
+++ e2fsprogs-1.39-my-patches-from-ted/misc/ChangeLog
@@ -1,3 +1,12 @@
+2006-08-30 Eric Sandeen <esandeen@redhat.com>
+
+ * dumpe2fs.c (list_desc, mark_table_blocks): Avoid overflows when
+ iterating over group descriptors on very large
+ filesystems.
+
+ * e2image.c (mark_table_blocks): Change block group loop to use a
+ common pattern of first_block/last_block, etc.
+
2006-08-30 Theodore Tso <tytso@mit.edu>
* tune2fs.c (main), mke2fs.c (PRS): Use e2p_percent to properly
Index: e2fsprogs-1.39-my-patches-from-ted/misc/dumpe2fs.c
===================================================================
--- e2fsprogs-1.39-my-patches-from-ted.orig/misc/dumpe2fs.c
+++ e2fsprogs-1.39-my-patches-from-ted/misc/dumpe2fs.c
@@ -130,7 +130,7 @@ static void list_desc (ext2_filsys fs)
{
unsigned long i;
long diff;
- blk_t group_blk, next_blk;
+ blk_t first_block, last_block;
blk_t super_blk, old_desc_blk, new_desc_blk;
char *block_bitmap=NULL, *inode_bitmap=NULL;
int inode_blocks_per_group, old_desc_blocks, reserved_gdt;
@@ -147,7 +147,7 @@ static void list_desc (ext2_filsys fs)
EXT2_BLOCK_SIZE(fs->super);
reserved_gdt = fs->super->s_reserved_gdt_blocks;
fputc('\n', stdout);
- group_blk = fs->super->s_first_data_block;
+ first_block = fs->super->s_first_data_block;
if (fs->super->s_feature_incompat & EXT2_FEATURE_INCOMPAT_META_BG)
old_desc_blocks = fs->super->s_first_meta_bg;
else
@@ -155,11 +155,14 @@ static void list_desc (ext2_filsys fs)
for (i = 0; i < fs->group_desc_count; i++) {
ext2fs_super_and_bgd_loc(fs, i, &super_blk,
&old_desc_blk, &new_desc_blk, 0);
- next_blk = group_blk + fs->super->s_blocks_per_group;
- if (next_blk > fs->super->s_blocks_count)
- next_blk = fs->super->s_blocks_count;
+ if (i == fs->group_desc_count - 1)
+ last_block = fs->super->s_blocks_count - 1;
+ else
+ last_block = first_block +
+ fs->super->s_blocks_per_group - 1;
+
printf (_("Group %lu: (Blocks "), i);
- print_range(group_blk, next_blk - 1);
+ print_range(first_block, last_block);
fputs(")", stdout);
print_bg_opts(fs, i);
has_super = ((i==0) || super_blk);
@@ -188,19 +191,19 @@ static void list_desc (ext2_filsys fs)
fputc('\n', stdout);
fputs(_(" Block bitmap at "), stdout);
print_number(fs->group_desc[i].bg_block_bitmap);
- diff = fs->group_desc[i].bg_block_bitmap - group_blk;
+ diff = fs->group_desc[i].bg_block_bitmap - first_block;
if (diff >= 0)
printf(" (+%ld)", diff);
fputs(_(", Inode bitmap at "), stdout);
print_number(fs->group_desc[i].bg_inode_bitmap);
- diff = fs->group_desc[i].bg_inode_bitmap - group_blk;
+ diff = fs->group_desc[i].bg_inode_bitmap - first_block;
if (diff >= 0)
printf(" (+%ld)", diff);
fputs(_("\n Inode table at "), stdout);
print_range(fs->group_desc[i].bg_inode_table,
fs->group_desc[i].bg_inode_table +
inode_blocks_per_group - 1);
- diff = fs->group_desc[i].bg_inode_table - group_blk;
+ diff = fs->group_desc[i].bg_inode_table - first_block;
if (diff > 0)
printf(" (+%ld)", diff);
printf (_("\n %d free blocks, %d free inodes, "
@@ -223,7 +226,7 @@ static void list_desc (ext2_filsys fs)
fputc('\n', stdout);
inode_bitmap += fs->super->s_inodes_per_group / 8;
}
- group_blk = next_blk;
+ first_block += fs->super->s_blocks_per_group;
}
}
Index: e2fsprogs-1.39-my-patches-from-ted/misc/e2image.c
===================================================================
--- e2fsprogs-1.39-my-patches-from-ted.orig/misc/e2image.c
+++ e2fsprogs-1.39-my-patches-from-ted/misc/e2image.c
@@ -244,21 +244,21 @@ static int process_file_block(ext2_filsy
static void mark_table_blocks(ext2_filsys fs)
{
- blk_t block, b;
+ blk_t first_block, b;
unsigned int i,j;
- block = fs->super->s_first_data_block;
+ first_block = fs->super->s_first_data_block;
/*
* Mark primary superblock
*/
- ext2fs_mark_block_bitmap(meta_block_map, block);
+ ext2fs_mark_block_bitmap(meta_block_map, first_block);
/*
* Mark the primary superblock descriptors
*/
for (j = 0; j < fs->desc_blocks; j++) {
ext2fs_mark_block_bitmap(meta_block_map,
- ext2fs_descriptor_block_loc(fs, block, j));
+ ext2fs_descriptor_block_loc(fs, first_block, j));
}
for (i = 0; i < fs->group_desc_count; i++) {
@@ -287,7 +287,7 @@ static void mark_table_blocks(ext2_filsy
ext2fs_mark_block_bitmap(meta_block_map,
fs->group_desc[i].bg_inode_bitmap);
}
- block += fs->super->s_blocks_per_group;
+ first_block += fs->super->s_blocks_per_group;
}
}