From c0a43e474789a92f91930a1c875eb7ce48e335c8 Mon Sep 17 00:00:00 2001 From: Ken Sumrall Date: Tue, 25 Jun 2013 20:02:00 -0700 Subject: 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 --- boot.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) 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) -- cgit v1.2.3