]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libblkid: udf: Fix reporting UDF 2.60 revision for Mac OS X disks
authorPali Rohár <pali.rohar@gmail.com>
Sun, 15 Dec 2019 11:55:41 +0000 (12:55 +0100)
committerPali Rohár <pali.rohar@gmail.com>
Sun, 15 Dec 2019 11:55:41 +0000 (12:55 +0100)
Apple's newfs_udf, when creating UDF 2.60 disks, sets value 2.50 into
both Minimum UDF Read Revision and Minimum UDF Write Revision fields in
LVIDIU. And sets 2.60 value into UDF revision field in LVD descriptor.

So to correctly parse and set blkid ID_FS_VERSION field, use maximum value
from Minimum UDF Read Revision in LVIDIU, Minimum UDF Write Revision in
LVDIU and UDF revision in LVD descriptor.

This commit also adds a testing UDF 2.60 disk image with 4K sectors created
by Apple's newfs_udf to verify that ID_FS_VERSION is set correctly to 2.60.

libblkid/src/superblocks/udf.c
tests/expected/blkid/low-probe-udf-hdd-macosx-2.60-4096 [new file with mode: 0644]
tests/ts/blkid/images-fs/udf-hdd-macosx-2.60-4096.img.xz [new file with mode: 0644]

index 1ab8a1e2649952d327b714dfc2e8b5230029123c..c27debd29d9808f32540857d836028ab065a1577 100644 (file)
@@ -367,7 +367,7 @@ real_blksz:
                        }
                        if (!udf_rev) {
                                /* UDF-2.60: 2.1.5.3: UDF revision field shall indicate revision of UDF document
-                                * We use this field as fallback value for ID_FS_VERSION when LVIDIU is missing */
+                                * We use maximal value from this field and from LVIDIU fields for ID_FS_VERSION */
                                if (strncmp(vd->type.logical.domain_id, "*OSTA UDF Compliant", sizeof(vd->type.logical.domain_id)) == 0)
                                        udf_rev = le16_to_cpu(vd->type.logical.udf_rev);
                        }
@@ -442,20 +442,19 @@ real_blksz:
                                                sizeof(*lvidiu));
                        if (!lvidiu)
                                return errno ? -errno : 1;
-                       /* Use Minimum UDF Read Revision as ID_FS_VERSION */
-                       lvidiu_udf_rev = le16_to_cpu(lvidiu->min_udf_read_rev);
-                       if (lvidiu_udf_rev)
-                               udf_rev = lvidiu_udf_rev;
                        /* UDF-2.60: 2. Basic Restrictions & Requirements:
                         * The Minimum UDF Read Revision value shall be at most #0250
                         * for all media with a UDF 2.60 file system.
-                        * So in this case use Minimum UDF Write Revision as ID_FS_VERSION
-                        * to distinguish between UDF 2.50 and UDF 2.60 discs. */
-                       if (lvidiu_udf_rev == 0x250) {
-                               lvidiu_udf_rev = le16_to_cpu(lvidiu->min_udf_write_rev);
-                               if (lvidiu_udf_rev > 0x250)
-                                       udf_rev = lvidiu_udf_rev;
-                       }
+                        * Because some 2.60 implementations put 2.50 into both LVIDIU
+                        * fields and 2.60 into LVD, use maximal value from LVD,
+                        * Minimum UDF Read Revision and Minimum UDF Write Revision for
+                        * ID_FS_VERSION to distinguish between UDF 2.50 and UDF 2.60 discs. */
+                       lvidiu_udf_rev = le16_to_cpu(lvidiu->min_udf_read_rev);
+                       if (lvidiu_udf_rev && udf_rev < lvidiu_udf_rev)
+                               udf_rev = lvidiu_udf_rev;
+                       lvidiu_udf_rev = le16_to_cpu(lvidiu->min_udf_write_rev);
+                       if (lvidiu_udf_rev && udf_rev < lvidiu_udf_rev)
+                               udf_rev = lvidiu_udf_rev;
                }
        }
 
diff --git a/tests/expected/blkid/low-probe-udf-hdd-macosx-2.60-4096 b/tests/expected/blkid/low-probe-udf-hdd-macosx-2.60-4096
new file mode 100644 (file)
index 0000000..9d58113
--- /dev/null
@@ -0,0 +1,11 @@
+ID_FS_BLOCK_SIZE=4096
+ID_FS_LABEL=Untitled_UDF_Volume
+ID_FS_LABEL_ENC=Untitled\x20UDF\x20Volume
+ID_FS_LOGICAL_VOLUME_ID=Untitled UDF Volume
+ID_FS_TYPE=udf
+ID_FS_USAGE=filesystem
+ID_FS_UUID=691eed1320284d61
+ID_FS_UUID_ENC=691eed1320284d61
+ID_FS_VERSION=2.60
+ID_FS_VOLUME_ID=MacOS X UDF 2017-12-28 1145.55
+ID_FS_VOLUME_SET_ID=691EED13 (Mac OS X newfs_udf) UDF Volume Set
diff --git a/tests/ts/blkid/images-fs/udf-hdd-macosx-2.60-4096.img.xz b/tests/ts/blkid/images-fs/udf-hdd-macosx-2.60-4096.img.xz
new file mode 100644 (file)
index 0000000..68412ad
Binary files /dev/null and b/tests/ts/blkid/images-fs/udf-hdd-macosx-2.60-4096.img.xz differ