svn commit: r323429 - stable/11/sys/fs/msdosfs
Konstantin Belousov
kib at FreeBSD.org
Mon Sep 11 08:16:40 UTC 2017
Author: kib
Date: Mon Sep 11 08:16:38 2017
New Revision: 323429
URL: https://svnweb.freebsd.org/changeset/base/323429
Log:
MFC r322982:
Verify that the BPB media descriptor and FAT ID match.
Modified:
stable/11/sys/fs/msdosfs/msdosfs_fat.c
Directory Properties:
stable/11/ (props changed)
Modified: stable/11/sys/fs/msdosfs/msdosfs_fat.c
==============================================================================
--- stable/11/sys/fs/msdosfs/msdosfs_fat.c Mon Sep 11 07:38:53 2017 (r323428)
+++ stable/11/sys/fs/msdosfs/msdosfs_fat.c Mon Sep 11 08:16:38 2017 (r323429)
@@ -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)
More information about the svn-src-all
mailing list