Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 12 Jul 2018 05:37:52 +0000 (UTC)
From:      Xin LI <delphij@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject:   svn commit: r336218 - stable/11/sbin/fsck_msdosfs
Message-ID:  <201807120537.w6C5bqF1008487@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: delphij
Date: Thu Jul 12 05:37:52 2018
New Revision: 336218
URL: https://svnweb.freebsd.org/changeset/base/336218

Log:
  MFC r335696,r335697:
  
  Detect exFAT filesystems and abort if found and tighten BPB sanity
  check.
  
  Obtained from:	Android https://android-review.googlesource.com/61827

Modified:
  stable/11/sbin/fsck_msdosfs/boot.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sbin/fsck_msdosfs/boot.c
==============================================================================
--- stable/11/sbin/fsck_msdosfs/boot.c	Thu Jul 12 02:51:50 2018	(r336217)
+++ stable/11/sbin/fsck_msdosfs/boot.c	Thu Jul 12 05:37:52 2018	(r336218)
@@ -82,6 +82,11 @@ readboot(int dosfs, struct bootblock *boot)
 
 	boot->FATsecs = boot->bpbFATsmall;
 
+	if (boot->bpbBytesPerSec % DOSBOOTBLOCKSIZE_REAL != 0 ||
+	    boot->bpbBytesPerSec / DOSBOOTBLOCKSIZE_REAL == 0) {
+		pfatal("Invalid sector size: %u", boot->bpbBytesPerSec);
+		return FSFATAL;
+	}
 	if (!boot->bpbRootDirEnts)
 		boot->flags |= FAT32;
 	if (boot->flags & FAT32) {
@@ -102,6 +107,22 @@ readboot(int dosfs, struct bootblock *boot)
 		boot->bpbFSInfo = block[48] + (block[49] << 8);
 		boot->bpbBackup = block[50] + (block[51] << 8);
 
+		/* If the OEM Name field is EXFAT, it's not FAT32, so bail */
+		if (!memcmp(&block[3], "EXFAT   ", 8)) {
+			pfatal("exFAT filesystem is not supported.");
+			return FSFATAL;
+		}
+
+		/* check basic parameters */
+		if ((boot->bpbFSInfo == 0) || (boot->bpbSecPerClust == 0)) {
+			/*
+			 * Either the BIOS Parameter Block has been corrupted,
+			 * or this is not a FAT32 filesystem, most likely an
+			 * exFAT filesystem.
+			 */
+			pfatal("Invalid FAT32 Extended BIOS Parameter Block");
+			return FSFATAL;
+		}
 		if (lseek(dosfs, boot->bpbFSInfo * boot->bpbBytesPerSec,
 		    SEEK_SET) != boot->bpbFSInfo * boot->bpbBytesPerSec
 		    || read(dosfs, fsinfo, sizeof fsinfo) != sizeof fsinfo) {
@@ -178,11 +199,6 @@ readboot(int dosfs, struct bootblock *boot)
 		/* Check backup bpbFSInfo?					XXX */
 	}
 
-	if (boot->bpbBytesPerSec % DOSBOOTBLOCKSIZE_REAL != 0 ||
-	    boot->bpbBytesPerSec == 0) {
-		pfatal("Invalid sector size: %u", boot->bpbBytesPerSec);
-		return FSFATAL;
-	}
 	if (boot->bpbSecPerClust == 0) {
 		pfatal("Invalid cluster size: %u", boot->bpbSecPerClust);
 		return FSFATAL;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201807120537.w6C5bqF1008487>