makefs: Verify that the BPB media descriptor and FAT ID match

From r322982 in sys/fs/msdosfs.
This commit is contained in:
Ed Maste 2019-08-21 19:09:40 +00:00
parent 476b0ab758
commit 59e9b3695a
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=351347

View File

@ -887,19 +887,17 @@ fillinusemap(struct msdosfsmount *pmp)
* zero. These represent free clusters.
*/
pmp->pm_freeclustercount = 0;
for (cn = CLUST_FIRST; cn <= pmp->pm_maxcluster; cn++) {
for (cn = 0; cn <= pmp->pm_maxcluster; cn++) {
byteoffset = FATOFS(pmp, cn);
bo = byteoffset % pmp->pm_fatblocksize;
if (bo == 0 || bp == NULL) {
if (bo == 0) {
/* Read new FAT block */
if (bp != NULL)
brelse(bp);
fatblock(pmp, byteoffset, &bn, &bsize, NULL);
error = bread(pmp->pm_devvp, bn, bsize, NOCRED, &bp);
if (error != 0) {
brelse(bp);
if (error != 0)
return (error);
}
}
if (FAT32(pmp))
readcn = getulong(bp->b_data + bo);
@ -909,7 +907,19 @@ fillinusemap(struct msdosfsmount *pmp)
readcn >>= 4;
readcn &= pmp->pm_fatmask;
if (readcn == CLUST_FREE)
/*
* Check if the FAT ID matches the BPB's media descriptor and
* all other bits are set to 1.
*/
if (cn == 0 && readcn != ((pmp->pm_fatmask & 0xffffff00) |
pmp->pm_bpb.bpbMedia)) {
#ifdef MSDOSFS_DEBUG
printf("mountmsdosfs(): Media descriptor in BPB"
"does not match FAT ID\n");
#endif
brelse(bp);
return (EINVAL);
} else if (readcn == CLUST_FREE)
usemap_free(pmp, cn);
}
if (bp != NULL)