[PATCH] 1/6 Avoid overflows in calculations of groups_count

Eric Sandeen <[email protected]> Wed, 16 Aug 2006 15:50:02 -0500
Newsgroups gmane.comp.file-systems.ext2.devel
Message-ID <[email protected]>
When s_blocks_count is at its maximum value (2^32-1), the way groups_count was
calculated could overflow; change the arithmetic to avoid this.

This is the same calculation that was submitted for the ext3 kernel mount code.

Signed-off-by: Eric Sandeen <[email protected]>

Index: e2fsprogs-1.39-test/ext2ed/init.c
===================================================================
--- e2fsprogs-1.39-test.orig/ext2ed/init.c
+++ e2fsprogs-1.39-test/ext2ed/init.c
@@ -415,8 +415,8 @@ int set_file_system_info (void)
 			file_system_info.first_group_desc_offset=2*EXT2_MIN_BLOCK_SIZE;
 		else
 			file_system_info.first_group_desc_offset=file_system_info.block_size;
-		file_system_info.groups_count=(	sb->s_blocks_count-sb->s_first_data_block+sb->s_blocks_per_group-1) /
-						sb->s_blocks_per_group;
+		file_system_info.groups_count = ((sb->s_blocks_count - sb->s_first_data_block - 1) /
+						 sb->s_blocks_per_group) + 1;
 	
 		file_system_info.inodes_per_block=file_system_info.block_size/sizeof (struct ext2_inode);
 		file_system_info.blocks_per_group=sb->s_inodes_per_group/file_system_info.inodes_per_block;
Index: e2fsprogs-1.39-test/lib/ext2fs/initialize.c
===================================================================
--- e2fsprogs-1.39-test.orig/lib/ext2fs/initialize.c
+++ e2fsprogs-1.39-test/lib/ext2fs/initialize.c
@@ -205,10 +205,9 @@ errcode_t ext2fs_initialize(const char *
 	}
 
 retry:
-	fs->group_desc_count = (super->s_blocks_count -
-				super->s_first_data_block +
-				EXT2_BLOCKS_PER_GROUP(super) - 1)
-		/ EXT2_BLOCKS_PER_GROUP(super);
+	fs->group_desc_count = ((super->s_blocks_count -
+				 super->s_first_data_block - 1)
+				/ EXT2_BLOCKS_PER_GROUP(super)) + 1;
 	if (fs->group_desc_count == 0) {
 		retval = EXT2_ET_TOOSMALL;
 		goto cleanup;
Index: e2fsprogs-1.39-test/lib/ext2fs/openfs.c
===================================================================
--- e2fsprogs-1.39-test.orig/lib/ext2fs/openfs.c
+++ e2fsprogs-1.39-test/lib/ext2fs/openfs.c
@@ -258,9 +258,9 @@ errcode_t ext2fs_open2(const char *name,
 		retval = EXT2_ET_CORRUPT_SUPERBLOCK;
 		goto cleanup;
 	}
-	fs->group_desc_count = (fs->super->s_blocks_count -
-				fs->super->s_first_data_block +
-				blocks_per_group - 1) / blocks_per_group;
+	fs->group_desc_count = ((fs->super->s_blocks_count -
+				 fs->super->s_first_data_block - 1)
+				/ blocks_per_group) + 1;
 	fs->desc_blocks = (fs->group_desc_count +
 			   EXT2_DESC_PER_BLOCK(fs->super) - 1)
 		/ EXT2_DESC_PER_BLOCK(fs->super);
Index: e2fsprogs-1.39-test/resize/resize2fs.c
===================================================================
--- e2fsprogs-1.39-test.orig/resize/resize2fs.c
+++ e2fsprogs-1.39-test/resize/resize2fs.c
@@ -190,10 +190,9 @@ errcode_t adjust_fs_info(ext2_filsys fs,
 	fs->super->s_blocks_count = new_size;
 
 retry:
-	fs->group_desc_count = (fs->super->s_blocks_count -
-				fs->super->s_first_data_block +
-				EXT2_BLOCKS_PER_GROUP(fs->super) - 1)
-		/ EXT2_BLOCKS_PER_GROUP(fs->super);
+	fs->group_desc_count = ((fs->super->s_blocks_count -
+				 fs->super->s_first_data_block - 1)
+				/ EXT2_BLOCKS_PER_GROUP(fs->super)) + 1;
 	if (fs->group_desc_count == 0)
 		return EXT2_ET_TOOSMALL;
 	fs->desc_blocks = (fs->group_desc_count +
Index: e2fsprogs-1.39-test/misc/mke2fs.c
===================================================================
--- e2fsprogs-1.39-test.orig/misc/mke2fs.c
+++ e2fsprogs-1.39-test/misc/mke2fs.c
@@ -819,8 +819,8 @@ static void parse_extended_opts(struct e
 			if (!bpg)
 				bpg = blocksize * 8;
 			gdpb = blocksize / sizeof(struct ext2_group_desc);
-			group_desc_count = (param->s_blocks_count +
-					    bpg - 1) / bpg;
+			group_desc_count = ((param->s_blocks_count - 1)
+						/ bpg) + 1;
 			desc_blocks = (group_desc_count +
 				       gdpb - 1) / gdpb;
 			rsv_groups = (resize + bpg - 1) / bpg;



-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642