[git commit master] mkfs_vfat: fixes for large image cases

Denys Vlasenko vda.linux at googlemail.com
Tue Nov 3 13:12:04 UTC 2009


commit: http://git.busybox.net/busybox/commit/?id=692bcff577fd3844e2017ffa6864d56f7a2bb5ad
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 util-linux/mkfs_vfat.c |   12 +++++++++---
 1 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/util-linux/mkfs_vfat.c b/util-linux/mkfs_vfat.c
index 10de2af..de88a74 100644
--- a/util-linux/mkfs_vfat.c
+++ b/util-linux/mkfs_vfat.c
@@ -391,16 +391,22 @@ int mkfs_vfat_main(int argc UNUSED_PARAM, char **argv)
 	while (1) {
 		while (1) {
 			int spf_adj;
-			off_t tcl = (volume_size_sect - reserved_sect - NUM_FATS * sect_per_fat) / sect_per_clust;
+			uoff_t tcl = (volume_size_sect - reserved_sect - NUM_FATS * sect_per_fat) / sect_per_clust;
 			// tcl may be > MAX_CLUST_32 here, but it may be
 			// because sect_per_fat is underestimated,
 			// and with increased sect_per_fat it still may become
 			// <= MAX_CLUST_32. Therefore, we do not check
 			// against MAX_CLUST_32, but against a bigger const:
-			if (tcl > 0x7fffffff)
+			if (tcl > 0x80ffffff)
 				goto next;
 			total_clust = tcl; // fits in uint32_t
-			spf_adj = ((total_clust + 2) * 4 + bytes_per_sect - 1) / bytes_per_sect - sect_per_fat;
+			// Every cluster needs 4 bytes in FAT. +2 entries since
+			// FAT has space for non-existent clusters 0 and 1.
+			// Let's see how many sectors that needs.
+			//May overflow at "*4":
+			//spf_adj = ((total_clust+2) * 4 + bytes_per_sect-1) / bytes_per_sect - sect_per_fat;
+			//Same in the more obscure, non-overflowing form:
+			spf_adj = ((total_clust+2) + (bytes_per_sect/4)-1) / (bytes_per_sect/4) - sect_per_fat;
 #if 0
 			bb_error_msg("sect_per_clust:%u sect_per_fat:%u total_clust:%u",
 					sect_per_clust, sect_per_fat, (int)tcl);
-- 
1.6.3.3



More information about the busybox-cvs mailing list