Detect exFAT filesystems and abort if found

If fsck_msdos tries to fix an exFAT filesystem, it will damage it
and it won't be mountable on systems that support exFAT.  So just
abort if the OEM name field is "EXFAT" or an invalid FAT32
Extended BIOS Parameter Block is detected.  The test to detect
an invalid BIOS Parameter Block was developed by Sony.

Change-Id: I09e8457e399239e840c825b858a635a7d9462def
diff --git a/boot.c b/boot.c
index 52bf011..5326a45 100644
--- a/boot.c
+++ b/boot.c
@@ -106,6 +106,25 @@
 		boot->FSInfo = block[48] + (block[49] << 8);
 		boot->Backup = 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->FSInfo == 0) ||
+		    (boot->BytesPerSec % DOSBOOTBLOCKSIZE != 0) ||
+		    (boot->BytesPerSec / DOSBOOTBLOCKSIZE == 0) ||
+		    (boot->SecPerClust == 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->FSInfo * boot->BytesPerSec, SEEK_SET)
 		    != boot->FSInfo * boot->BytesPerSec
 		    || read(dosfs, fsinfo, sizeof fsinfo)