chiark / gitweb /
libvolume_id: fix weird fat volume recognition
[elogind.git] / extras / volume_id / libvolume_id / fat.c
index 26d0fe74ab3c042a978fb2de543b2dd2b3c7ed6c..cea5b8cff2bda7c23e57a8ef3da5b30613192d7e 100644 (file)
@@ -161,48 +161,45 @@ int volume_id_probe_vfat(struct volume_id *id, uint64_t off)
                return -1;
 
        if (memcmp(vs->type.fat32.magic, "MSWIN", 5) == 0)
-               goto valid;
+               goto magic;
 
        if (memcmp(vs->type.fat32.magic, "FAT32   ", 8) == 0)
-               goto valid;
+               goto magic;
 
        if (memcmp(vs->type.fat.magic, "FAT16   ", 8) == 0)
-               goto valid;
+               goto magic;
 
        if (memcmp(vs->type.fat.magic, "MSDOS", 5) == 0)
-               goto valid;
+               goto magic;
 
        if (memcmp(vs->type.fat.magic, "FAT12   ", 8) == 0)
-               goto valid;
+               goto magic;
 
-       /*
-        * There are old floppies out there without a magic, so we check
-        * for well known values and guess if it's a fat volume
-        */
+       /* some old floppies don't have a magic, so we expect the boot code to match */
 
        /* boot jump address check */
        if ((vs->boot_jump[0] != 0xeb || vs->boot_jump[2] != 0x90) &&
             vs->boot_jump[0] != 0xe9)
                return -1;
 
-       /* heads check */
-       if (vs->heads == 0)
+magic:
+       /* reserverd sector count */
+       if (!vs->reserved)
                return -1;
 
-       /* cluster size check*/ 
-       if (vs->sectors_per_cluster == 0 ||
-           (vs->sectors_per_cluster & (vs->sectors_per_cluster-1)))
+       /* fat count*/
+       if (!vs->fats)
                return -1;
 
        /* media check */
        if (vs->media < 0xf8 && vs->media != 0xf0)
                return -1;
 
-       /* fat count*/
-       if (vs->fats != 2)
+       /* cluster size check*/ 
+       if (vs->sectors_per_cluster == 0 ||
+           (vs->sectors_per_cluster & (vs->sectors_per_cluster-1)))
                return -1;
 
-valid:
        /* sector size check */
        sector_size = le16_to_cpu(vs->sector_size);
        if (sector_size != 0x200 && sector_size != 0x400 &&