Package: release.debian.org
Severity: normal
User: release.debian....@packages.debian.org
Usertags: unblock
X-Debbugs-Cc: pkg-utopia-maintain...@lists.alioth.debian.org

Please unblock package udisks2

It fixes #987582:
udisks_client_get_block_for_drive() always returns the wrong block of eMMC

It's an upstream cherry-pick which ensure eMMC block devices are
detected correctly.

[ Tests ]
No automated tests for this code, but the fix was confirmed by the
original bug submitter.

[ Risks ]
udisks2 is a key package, but the change is rather small, see
https://github.com/storaged-project/udisks/commit/5d0ac7ebefb8b7aad73871936f5011545cc66344

[ Checklist ]
  [x] all changes are documented in the d/changelog
  [x] I reviewed all changes and I approve them
  [x] attach debdiff against the package in testing

[ Other info ]

unblock udisks2/2.9.2-2
diff --git a/debian/changelog b/debian/changelog
index fabe2505..51c3b887 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,11 @@
+udisks2 (2.9.2-2) unstable; urgency=medium
+
+  * udisksclient: Make get_block_for_drive deterministic.
+    Fixes "udisks_client_get_block_for_drive() always returns the wrong
+    block of eMMC". (Closes: #987582)
+
+ -- Michael Biebl <bi...@debian.org>  Mon, 26 Apr 2021 21:12:10 +0200
+
 udisks2 (2.9.2-1) unstable; urgency=medium
 
   * New upstream version 2.9.2
diff --git a/debian/patches/series b/debian/patches/series
new file mode 100644
index 00000000..b5f3547a
--- /dev/null
+++ b/debian/patches/series
@@ -0,0 +1 @@
+udisksclient-Make-get_block_for_drive-deterministic.patch
diff --git 
a/debian/patches/udisksclient-Make-get_block_for_drive-deterministic.patch 
b/debian/patches/udisksclient-Make-get_block_for_drive-deterministic.patch
new file mode 100644
index 00000000..e33737f0
--- /dev/null
+++ b/debian/patches/udisksclient-Make-get_block_for_drive-deterministic.patch
@@ -0,0 +1,71 @@
+From: Will Thompson <w...@endlessos.org>
+Date: Wed, 21 Apr 2021 10:56:30 +0100
+Subject: udisksclient: Make get_block_for_drive deterministic
+
+While any given Block object has at most one corresponding Drive, many
+Block objects may share the same Drive. One example is eMMC devices
+which provide a block device for the main data area (e.g. /dev/mmcblk0)
+as well as additional logical block devices for device partitions (e.g.
+/dev/mmcblk0boot0 and /dev/mmcblk0boot1).
+
+This behaviour was introduced in #834 to resolve issue #619 that these
+device partitions caused a phantom additional Drive object to be
+exposed. On that issue, I wrote:
+
+> I believe that Block.Drive on the boot partitions should point to the
+> same data area as the main data area (and its logical partitions);
+> udisks_client_get_block_for_drive() on the drive should return
+> /org/freedesktop/UDisks2/block_devices/mmcblk0.
+
+The first part is now true, but as described on #879 the second part is
+not true. It is now non-deterministic which Block will be returned,
+based only on the order of objects returned by
+g_dbus_object_manager_get_objects().
+
+Make the return value of udisks_client_get_block_for_drive()
+deterministic by sorting the list of candidate Block objects by their
+device path in lexicographic order. Since (e.g.) /dev/mmcblk0 sorts
+before /dev/mmcblk0boot0, this has the desirable side-effect that
+calling udisks_client_get_block_for_drive() on an eMMC Drive returns the
+'real' Block for the main data area.
+
+Fixes #879.
+
+(cherry picked from commit 5d0ac7ebefb8b7aad73871936f5011545cc66344)
+---
+ udisks/udisksclient.c | 15 +++++++++++++++
+ 1 file changed, 15 insertions(+)
+
+diff --git a/udisks/udisksclient.c b/udisks/udisksclient.c
+index 463b15a..1855209 100644
+--- a/udisks/udisksclient.c
++++ b/udisks/udisksclient.c
+@@ -816,6 +816,20 @@ udisks_client_get_block_for_dev (UDisksClient *client,
+ 
+ /* 
----------------------------------------------------------------------------------------------------
 */
+ 
++static int
++compare_blocks_by_device (gconstpointer a,
++                          gconstpointer b)
++{
++  UDisksBlock *block_a = udisks_object_get_block (UDISKS_OBJECT (a));
++  UDisksBlock *block_b = udisks_object_get_block (UDISKS_OBJECT (b));
++
++  g_assert (block_a != NULL);
++  g_assert (block_b != NULL);
++
++  return g_strcmp0 (udisks_block_get_device (block_a),
++                    udisks_block_get_device (block_b));
++}
++
+ static GList *
+ get_top_level_blocks_for_drive (UDisksClient *client,
+                                 const gchar  *drive_object_path)
+@@ -847,6 +861,7 @@ get_top_level_blocks_for_drive (UDisksClient *client,
+         }
+       g_object_unref (block);
+     }
++  ret = g_list_sort (ret, compare_blocks_by_device);
+   g_list_free_full (object_proxies, g_object_unref);
+   return ret;
+ }

Reply via email to