1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-15 10:17:20 +00:00

Fix division by zero when reading boot block by postponing division

until it is necessary and after we validated bytes per sector is non-
zero.

Obtained from:	Android https://android-review.googlesource.com/c/platform/external/fsck_msdos/+/36362
MFC after:	2 weeks
This commit is contained in:
Xin LI 2018-06-26 06:18:59 +00:00
parent 67fc3f5608
commit f7a300540f
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=335655

View File

@ -178,12 +178,8 @@ readboot(int dosfs, struct bootblock *boot)
/* Check backup bpbFSInfo? XXX */
}
boot->ClusterOffset = (boot->bpbRootDirEnts * 32 +
boot->bpbBytesPerSec - 1) / boot->bpbBytesPerSec +
boot->bpbResSectors + boot->bpbFATs * boot->FATsecs -
CLUST_FIRST * boot->bpbSecPerClust;
if (boot->bpbBytesPerSec % DOSBOOTBLOCKSIZE_REAL != 0) {
if (boot->bpbBytesPerSec % DOSBOOTBLOCKSIZE_REAL != 0 ||
boot->bpbBytesPerSec == 0) {
pfatal("Invalid sector size: %u", boot->bpbBytesPerSec);
return FSFATAL;
}
@ -196,6 +192,10 @@ readboot(int dosfs, struct bootblock *boot)
boot->NumSectors = boot->bpbSectors;
} else
boot->NumSectors = boot->bpbHugeSectors;
boot->ClusterOffset = (boot->bpbRootDirEnts * 32 +
boot->bpbBytesPerSec - 1) / boot->bpbBytesPerSec +
boot->bpbResSectors + boot->bpbFATs * boot->FATsecs -
CLUST_FIRST * boot->bpbSecPerClust;
boot->NumClusters = (boot->NumSectors - boot->ClusterOffset) /
boot->bpbSecPerClust;