makefs: Verify that the BPB media descriptor and FAT ID match
From r322982 in sys/fs/msdosfs.
This commit is contained in:
parent
476b0ab758
commit
59e9b3695a
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user