Author: emaste
Date: Mon Sep  9 17:33:31 2019
New Revision: 352080
URL: https://svnweb.freebsd.org/changeset/base/352080

Log:
  MFC r351347: makefs: Verify that the BPB media descriptor and FAT ID match
  
  From r322982 in sys/fs/msdosfs.

Modified:
  stable/12/usr.sbin/makefs/msdos/msdosfs_fat.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/usr.sbin/makefs/msdos/msdosfs_fat.c
==============================================================================
--- stable/12/usr.sbin/makefs/msdos/msdosfs_fat.c       Mon Sep  9 17:32:40 
2019        (r352079)
+++ stable/12/usr.sbin/makefs/msdos/msdosfs_fat.c       Mon Sep  9 17:33:31 
2019        (r352080)
@@ -888,19 +888,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);
@@ -910,7 +908,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)
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to