summaryrefslogtreecommitdiffstats
path: root/sys/fs/msdosfs/msdosfs_fat.c
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2017-09-11 08:16:38 +0000
committerkib <kib@FreeBSD.org>2017-09-11 08:16:38 +0000
commit4930e0a9013e596893b9aabe30cfed37a96a28eb (patch)
treed8b9a57809dabe8d9313e86aac7526d22b108170 /sys/fs/msdosfs/msdosfs_fat.c
parent73fc1b681630b4147f2fd3bb6551e24cb46b71f4 (diff)
downloadFreeBSD-src-4930e0a9013e596893b9aabe30cfed37a96a28eb.zip
FreeBSD-src-4930e0a9013e596893b9aabe30cfed37a96a28eb.tar.gz
MFC r322982:
Verify that the BPB media descriptor and FAT ID match.
Diffstat (limited to 'sys/fs/msdosfs/msdosfs_fat.c')
-rw-r--r--sys/fs/msdosfs/msdosfs_fat.c24
1 files changed, 17 insertions, 7 deletions
diff --git a/sys/fs/msdosfs/msdosfs_fat.c b/sys/fs/msdosfs/msdosfs_fat.c
index 4bceeba..87e31a6 100644
--- a/sys/fs/msdosfs/msdosfs_fat.c
+++ b/sys/fs/msdosfs/msdosfs_fat.c
@@ -908,19 +908,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 || !bp) {
+ if (bo == 0) {
/* Read new FAT block */
- if (bp)
+ if (bp != NULL)
brelse(bp);
fatblock(pmp, byteoffset, &bn, &bsize, NULL);
error = bread(pmp->pm_devvp, bn, bsize, NOCRED, &bp);
- if (error) {
- brelse(bp);
+ if (error != 0)
return (error);
- }
}
if (FAT32(pmp))
readcn = getulong(&bp->b_data[bo]);
@@ -930,7 +928,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)
OpenPOWER on IntegriCloud