diff options
author | Sebastian Rasmussen <sebastian.rasmussen@stericsson.com> | 2011-02-01 15:35:50 +0100 |
---|---|---|
committer | Christian Bejram <christian.bejram@stericsson.com> | 2012-05-07 18:43:38 +0200 |
commit | fe7400ddb5e99a790cd3977f9e5151d8ea929a14 (patch) | |
tree | 5a6efa49bc9563936d9eb661b427a9769658e24f | |
parent | e1dd6c88cff4f71c298921ef34f7662eb227aacf (diff) | |
download | android_external_fsck_msdos-fe7400ddb5e99a790cd3977f9e5151d8ea929a14.tar.gz android_external_fsck_msdos-fe7400ddb5e99a790cd3977f9e5151d8ea929a14.tar.bz2 android_external_fsck_msdos-fe7400ddb5e99a790cd3977f9e5151d8ea929a14.zip |
Fix division-by-zero when reading partition tables
When fsck_msdos was asked to analyze a device that contained
a partition table in its first sector fsck_msdos was doing a
division-by-zero because of mostly zeroed out fields. This
fix postpones the division until it is necessary, while
other tests already present detect the zeroed out fields and
so fsck_msdos fails in a controlled fashion.
Change-Id: Id2274b140449f4470f95a0215277f2f2de4cb7b0
Signed-off-by: Sebastian Rasmussen <sebastian.rasmussen@stericsson.com>
Signed-off-by: christian bejram <christian.bejram@stericsson.com>
-rw-r--r-- | boot.c | 17 |
1 files changed, 11 insertions, 6 deletions
@@ -193,12 +193,6 @@ readboot(dosfs, boot) /* Check backup FSInfo? XXX */ } - boot->ClusterOffset = (boot->RootDirEnts * 32 + boot->BytesPerSec - 1) - / boot->BytesPerSec - + boot->ResSectors - + boot->FATs * boot->FATsecs - - CLUST_FIRST * boot->SecPerClust; - if (boot->BytesPerSec % DOSBOOTBLOCKSIZE != 0) { pfatal("Invalid sector size: %u", boot->BytesPerSec); return FSFATAL; @@ -207,11 +201,22 @@ readboot(dosfs, boot) pfatal("Invalid cluster size: %u", boot->SecPerClust); return FSFATAL; } + if (boot->BytesPerSec == 0) { + pfatal("Invalid sector size: %u", boot->BytesPerSec); + return FSFATAL; + } if (boot->Sectors) { boot->HugeSectors = 0; boot->NumSectors = boot->Sectors; } else boot->NumSectors = boot->HugeSectors; + + boot->ClusterOffset = (boot->RootDirEnts * 32 + boot->BytesPerSec - 1) + / boot->BytesPerSec + + boot->ResSectors + + boot->FATs * boot->FATsecs + - CLUST_FIRST * boot->SecPerClust; + boot->NumClusters = (boot->NumSectors - boot->ClusterOffset) / boot->SecPerClust; if (boot->flags&FAT32) |