[Bug 1164683] Re: libblkid: udf superblock does not read correctly when blocksize < 2048

Jim Trigg jtrigg at spamcop.net
Thu Apr 4 19:40:52 UTC 2013


diff --git a/AUTHORS b/AUTHORS
index f29f9a3..54fe7ce 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -385,5 +385,6 @@ CONTRIBUTORS:
       Yoshihiro Takahashi <ytakahashi at miraclelinux.com>
       Yuri Chornoivan <yurchor at ukr.net>
       Yu Zhiguo <yuzg at cn.fujitsu.com>
+      Zachary Catlin <z at zc.is>
       Zdenek Behan <rain at matfyz.cz>
       Zhi Li <lizhi1215 at gmail.com>
diff --git a/libblkid/src/superblocks/udf.c b/libblkid/src/superblocks/udf.c
index 2cb471d..c9fb022 100644
--- a/libblkid/src/superblocks/udf.c
+++ b/libblkid/src/superblocks/udf.c
@@ -64,17 +64,25 @@ static int probe_udf(blkid_probe pr,
        struct volume_descriptor *vd;
        struct volume_structure_descriptor *vsd;
        unsigned int bs;
+       unsigned int pbs[2];
        unsigned int b;
        unsigned int type;
        unsigned int count;
        unsigned int loc;
+       unsigned int i;

-       /* search Volume Sequence Descriptor (VSD) to get the logical
-        * block size of the volume */
-       for (bs = 0x800; bs < 0x8000; bs += 0x800) {
+       /* The block size of a UDF filesystem is that of the underlying
+        * storage; we check later on for the special case of image files,
+        * which may have the 2048-byte block size of optical media. */
+       pbs[0] = blkid_probe_get_sectorsize(pr);
+       pbs[1] = 0x800;
+
+       /* check for a Volume Structure Descriptor (VSD); each is
+        * 2048 bytes long */
+       for (b = 0; b < 0x8000; b += 0x800) {
                vsd = (struct volume_structure_descriptor *)
                        blkid_probe_get_buffer(pr,
-                                       UDF_VSD_OFFSET + bs,
+                                       UDF_VSD_OFFSET + b,
                                        sizeof(*vsd));
                if (!vsd)
                        return 1;
@@ -88,7 +96,7 @@ static int probe_udf(blkid_probe pr,
        for (b = 0; b < 64; b++) {
                vsd = (struct volume_structure_descriptor *)
                        blkid_probe_get_buffer(pr,
-                                       UDF_VSD_OFFSET + ((blkid_loff_t) b * bs),
+                                       UDF_VSD_OFFSET + ((blkid_loff_t) b * 0x800),
                                        sizeof(*vsd));
                if (!vsd)
                        return -1;
@@ -102,17 +110,24 @@ static int probe_udf(blkid_probe pr,
        return -1;

 anchor:
-       /* read Anchor Volume Descriptor (AVDP) */
-       vd = (struct volume_descriptor *)
-               blkid_probe_get_buffer(pr, 256 * bs, sizeof(*vd));
-       if (!vd)
-               return -1;
-
-       type = le16_to_cpu(vd->tag.id);
-       if (type != 2) /* TAG_ID_AVDP */
-               return 0;
+       /* read Anchor Volume Descriptor (AVDP), checking block size */
+       for (i = 0; i < 2; i++) {
+               vd = (struct volume_descriptor *)
+                       blkid_probe_get_buffer(pr, 256 * pbs[i], sizeof(*vd));
+               if (!vd)
+                       return -1;
+
+               type = le16_to_cpu(vd->tag.id);
+               if (type == 2) /* TAG_ID_AVDP */
+                       goto real_blksz;
+       }
+       return 0;
+
+real_blksz:
+       /* Use the actual block size from here on out */
+       bs = pbs[i];

-       /* get desriptor list address and block count */
+       /* get descriptor list address and block count */
        count = le32_to_cpu(vd->type.anchor.length) / bs;
        loc = le32_to_cpu(vd->type.anchor.location);

-- 
You received this bug notification because you are a member of Ubuntu
Foundations Bugs, which is subscribed to util-linux in Ubuntu.
https://bugs.launchpad.net/bugs/1164683

Title:
  libblkid: udf superblock does not read correctly when blocksize < 2048

Status in “util-linux” package in Ubuntu:
  New

Bug description:
  This causes various problems such as:
  A) udf filesystems with blocksize < 2048 will not automount at startup.
  B) udf filesystems with blocksize < 2048 will not show or be mounted by volume label (vid).

  This issue has been identified upstream and a patch is available (git
  commit 5a45eb2d2c70dc7ea2ff4c7b56ab8dba2780f033 in karelzak/util-
  linux).

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/util-linux/+bug/1164683/+subscriptions




More information about the foundations-bugs mailing list