chiark / gitweb /
volume_id: fat - accept empty FAT32 fsinfo signature
authorKay Sievers <kay.sievers@vrfy.org>
Thu, 13 Nov 2008 18:40:24 +0000 (19:40 +0100)
committerKay Sievers <kay.sievers@vrfy.org>
Thu, 13 Nov 2008 18:40:24 +0000 (19:40 +0100)
extras/volume_id/lib/fat.c
extras/volume_id/lib/volume_id.c

index 2d98b65..c0cfed8 100644 (file)
@@ -411,7 +411,11 @@ magic:
 
 fat32:
        info("looking for FAT32\n");
-       /* FAT32 should have a valid signature in the fsinfo block */
+       /*
+        * FAT32 should have a valid signature in the fsinfo block,
+        * but also allow all bytes set to '\0', because some volumes
+        * do not set the signature at all.
+        */
        fsinfo_sect = le16_to_cpu(vs->type.fat32.fsinfo_sector);
        buf = volume_id_get_buffer(id, off + (fsinfo_sect * sector_size), 0x200);
        if (buf == NULL)
@@ -423,11 +427,13 @@ fat32:
        info("signature2: 0x%02x%02x%02x%02x\n",
             fsinfo->signature2[0], fsinfo->signature2[1],
             fsinfo->signature2[2], fsinfo->signature2[3]);
-       if (memcmp(fsinfo->signature1, "\x52\x52\x61\x41", 4) != 0)
+       if (memcmp(fsinfo->signature1, "\x52\x52\x61\x41", 4) != 0 &&
+           memcmp(fsinfo->signature1, "\x00\x00\x00\x00", 4) != 0)
                return -1;
-       if (memcmp(fsinfo->signature2, "\x72\x72\x41\x61", 4) != 0)
+       if (memcmp(fsinfo->signature2, "\x72\x72\x41\x61", 4) != 0 &&
+           memcmp(fsinfo->signature2, "\x00\x00\x00\x00", 4) != 0)
                return -1 ;
-       info("FAT32 signatures match\n");
+       info("FAT32 signatures ok\n");
 
        vs = (struct vfat_super_block *) volume_id_get_buffer(id, off, 0x200);
        if (vs == NULL)
index e4d2ed4..aaaab7e 100644 (file)
@@ -418,7 +418,7 @@ int volume_id_probe_filesystem(struct volume_id *id, uint64_t off, uint64_t size
         * to make the filesystem detection successful.
         *
         * We do not want to read that many bytes from probed floppies, skip volumes
-        * smaller than a usual floppy disk
+        * smaller than a usual floppy disk.
         */
        if (size > 1440 * 1024) {
                int found = 0;