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:
parent
67fc3f5608
commit
f7a300540f
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=335655
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user