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.
|
* zero. These represent free clusters.
|
||||||
*/
|
*/
|
||||||
pmp->pm_freeclustercount = 0;
|
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);
|
byteoffset = FATOFS(pmp, cn);
|
||||||
bo = byteoffset % pmp->pm_fatblocksize;
|
bo = byteoffset % pmp->pm_fatblocksize;
|
||||||
if (bo == 0 || bp == NULL) {
|
if (bo == 0) {
|
||||||
/* Read new FAT block */
|
/* Read new FAT block */
|
||||||
if (bp != NULL)
|
if (bp != NULL)
|
||||||
brelse(bp);
|
brelse(bp);
|
||||||
fatblock(pmp, byteoffset, &bn, &bsize, NULL);
|
fatblock(pmp, byteoffset, &bn, &bsize, NULL);
|
||||||
error = bread(pmp->pm_devvp, bn, bsize, NOCRED, &bp);
|
error = bread(pmp->pm_devvp, bn, bsize, NOCRED, &bp);
|
||||||
if (error != 0) {
|
if (error != 0)
|
||||||
brelse(bp);
|
|
||||||
return (error);
|
return (error);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (FAT32(pmp))
|
if (FAT32(pmp))
|
||||||
readcn = getulong(bp->b_data + bo);
|
readcn = getulong(bp->b_data + bo);
|
||||||
@ -909,7 +907,19 @@ fillinusemap(struct msdosfsmount *pmp)
|
|||||||
readcn >>= 4;
|
readcn >>= 4;
|
||||||
readcn &= pmp->pm_fatmask;
|
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);
|
usemap_free(pmp, cn);
|
||||||
}
|
}
|
||||||
if (bp != NULL)
|
if (bp != NULL)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user