Whamcloud - gitweb
Fix overflow in calculation of total file system blocks
authorValerie Aurora Henson <vaurora@redhat.com>
Tue, 8 Sep 2009 01:23:03 +0000 (21:23 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Tue, 8 Sep 2009 01:23:03 +0000 (21:23 -0400)
Blocks per group and group desc count are both 32-bit; multiplied they
produce a 32-bit quantity which overflowed.

Signed-off-by: Valerie Aurora Henson <vaurora@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
e2fsck/pass5.c
lib/ext2fs/bitmaps.c
lib/ext2fs/rw_bitmaps.c

index a2a00b1..c27989a 100644 (file)
@@ -662,7 +662,7 @@ static void check_block_end(e2fsck_t ctx)
        clear_problem_context(&pctx);
 
        end = ext2fs_get_block_bitmap_start2(fs->block_map) +
-               (EXT2_BLOCKS_PER_GROUP(fs->super) * fs->group_desc_count) - 1;
+               ((blk64_t)EXT2_BLOCKS_PER_GROUP(fs->super) * fs->group_desc_count) - 1;
        pctx.errcode = ext2fs_fudge_block_bitmap_end2(fs->block_map, end,
                                                     &save_blocks_count);
        if (pctx.errcode) {
index 8dc8465..91a8c96 100644 (file)
@@ -92,8 +92,8 @@ errcode_t ext2fs_allocate_block_bitmap(ext2_filsys fs,
 
        start = fs->super->s_first_data_block;
        end = ext2fs_blocks_count(fs->super)-1;
-       real_end = (EXT2_BLOCKS_PER_GROUP(fs->super)
-                   * fs->group_desc_count)-1 + start;
+       real_end = ((__u64) EXT2_BLOCKS_PER_GROUP(fs->super)
+                   * (__u64) fs->group_desc_count)-1 + start;
 
        if (fs->flags & EXT2_FLAG_64BITS)
                return (ext2fs_alloc_generic_bmap(fs,
index 08d3a5e..a100618 100644 (file)
@@ -212,7 +212,7 @@ static errcode_t read_bitmaps(ext2_filsys fs, int do_inode, int do_block)
                }
                blk = (fs->image_header->offset_blockmap /
                       fs->blocksize);
-               blk_cnt = EXT2_BLOCKS_PER_GROUP(fs->super) *
+               blk_cnt = (blk64_t)EXT2_BLOCKS_PER_GROUP(fs->super) *
                        fs->group_desc_count;
                while (block_nbytes > 0) {
                        retval = io_channel_read_blk64(fs->image_io, blk++,