From 92fc937ba448eb0e0bc07ec4eeb7f44995c5346a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pali=20Roh=C3=A1r?= Date: Sun, 15 Dec 2019 12:55:41 +0100 Subject: [PATCH] libblkid: udf: Fix reporting UDF 2.60 revision for Mac OS X disks 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 | 23 +++++++++--------- .../blkid/low-probe-udf-hdd-macosx-2.60-4096 | 11 +++++++++ .../images-fs/udf-hdd-macosx-2.60-4096.img.xz | Bin 0 -> 2604 bytes 3 files changed, 22 insertions(+), 12 deletions(-) create mode 100644 tests/expected/blkid/low-probe-udf-hdd-macosx-2.60-4096 create mode 100644 tests/ts/blkid/images-fs/udf-hdd-macosx-2.60-4096.img.xz diff --git a/libblkid/src/superblocks/udf.c b/libblkid/src/superblocks/udf.c index 1ab8a1e26..c27debd29 100644 --- a/libblkid/src/superblocks/udf.c +++ b/libblkid/src/superblocks/udf.c @@ -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 index 000000000..9d581137e --- /dev/null +++ b/tests/expected/blkid/low-probe-udf-hdd-macosx-2.60-4096 @@ -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 index 0000000000000000000000000000000000000000..68412ada5e6d33c5f4b209700ee78d95b325cb02 GIT binary patch literal 2604 zcmeH}`#;kQ7{|X`b4_7oEho7wVqIJh#W6cF=;!B$=Xu_r&*$|#Yi7}2-T(j@>#48> z1Dc?1001bx^lFnx_Ct6+01&b!k>v0sc2@Q(VW<rZ}gii&>*L> z*p|dZoPN%Rw}0dfUq>jri}3KKh{X37mTZLb@eTvp?Mg1aj)zp{ule1OEpu)rgkV`F z6V9o=_2AP!l?6L&9&HG?|F!?X%bf`!?1EPK`-jCRwfhNqI^$VV=D{4d8Qy2^J2m&J zhY<&RuW^%(b7e+G(KW@)7YW&)(q7ziror>qp(ou{dYW2BLW3GRBRF=h(z&j|ivhK# zFm0?Y2!2eL!pr)5e=2?CEhu}!+K>TMpQw4&DsO|nFx8buFG_COhm{P#F$oJ8UJWJk zOT**`=??)P*Nuwim9ATeAMAOvPfxhiaz0$RHFtKg-*>JML8nD|6)6a+hEw7Z5G$_3 zD)P;GGcUc)F_$^&;&~0bs*k4z>0P_GY=y9&vHS0(Q7fWSC`N7PY`DIsk1xNLzb(Q- zH#eQoj(O10JmCL+vY2uyMqSVy?pa*TqZOT@sC3Fe8~sbJJSA<}-W~u;)3&M9r-<>x zbBsfpYOS|CMvYJuk<*BRIc3Jk`kbRp(}l;J-oCAvL>tEr#xc@hFp9^HpWL%LHn@kd zty!@T+9P9AZ3=Q9gA92(WSUoIU_H0-sjRWgc3aF6-9QinxgmkGC~#yX7|C ztF}t@vm|#06@j3R{^`WQNUJjO`SoHBR(?qEdx(=C0zsiTqAGl_r8!1L(l(;(yS~nrk%VJ86HKx!jo$!C9Q0LML6hh;v-6rlV{poM4v$DfnPfKDG3a1XC-ggZ9JTSZv#n5#Aps zqeYpo$P(*ISHd*0JCl|dq^ zACbagwMEYRIl^K)i4rdX(aod>o5i(<`tZx@JZ4PFHuj|Cxmid#3kn5>IT}u{8VkGX zq~9`=NoedqpmX47`=>c5?Eu;4`P5=#k?x=iytMZDzH5(gQ??`{D987h6`B(xcCK-O+Gl zB_D>?^VASmHLK8k$w4Q1@Ty*lY`3XPdGdDnq5e!Vm(zGblYNIi|R5P!M;)W2wizdA{B z^QxOX&&H389+i?^Y3}EI6}#;UZ{L1Y!+K@Fec!U4ubd^h6&WaG90f0COO!ynfa!DY z`D=A0mkd?2c{dD$f6yo2Gef22Y~$m-#G?OT{qJw>s)#B73G6$x`U&hi&HWFs!=U8< zVI<|%<2bP$I3L*RjlyTKk=5}@ANOcqf9HqjnwYr=shUb(QSP30lT@n^;>I_LbDGsz z>Lf%eKYGsJ$}+(eV4|nW=HgffSnpqt*nT-YOO4oV@UFq-FkLG{dL6OltmWoAt5&m8v%KSfXJMyPKKBQQov34Mze2! ipCdXXP|lxi1b`AYlgVT$G9U#lYxEO?ztsQ;-urJ(WDEKL literal 0 HcmV?d00001