summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJean-Baptiste Queru <jbq@google.com>2013-07-08 22:33:32 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2013-07-08 22:33:33 +0000
commitb94f2b6107f2adfd635fbec55ce6105687eb68b3 (patch)
treed09c9552b273c6f4afbed7db6ba674539bcfde66
parented86a9f77e796aa5923a5b2d1455a7739b86e60b (diff)
parentf03428811bed72a009839b1616ffcac11fcfd6b0 (diff)
downloadandroid_external_fsck_msdos-b94f2b6107f2adfd635fbec55ce6105687eb68b3.tar.gz
android_external_fsck_msdos-b94f2b6107f2adfd635fbec55ce6105687eb68b3.tar.bz2
android_external_fsck_msdos-b94f2b6107f2adfd635fbec55ce6105687eb68b3.zip
Merge "Detect exFAT filesystems and abort if found"
-rw-r--r--boot.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/boot.c b/boot.c
index 52bf011..5326a45 100644
--- a/boot.c
+++ b/boot.c
@@ -106,6 +106,25 @@ readboot(dosfs, boot)
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)