commit:     379060f482819c4f29ce4774626a8aca55d6b462
Author:     Pacho Ramos <pacho <AT> gentoo <DOT> org>
AuthorDate: Sun Sep 15 12:02:33 2024 +0000
Commit:     Pacho Ramos <pacho <AT> gentoo <DOT> org>
CommitDate: Sun Sep 15 12:24:58 2024 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=379060f4

sys-fs/udisks: Multiple bugfixes from upstream

Signed-off-by: Pacho Ramos <pacho <AT> gentoo.org>

 .../files/udisks-2.10.1-BLKRRPART_harder.patch     |  55 ++++++++
 ....10.1-targetcli_config.json_netif_timeout.patch |  38 ++++++
 ....1-udiskslinuxblock_survive_missing_fstab.patch |  32 +++++
 ...-2.10.1-udiskslinuxmanager_use_after_free.patch | 112 ++++++++++++++++
 sys-fs/udisks/udisks-2.10.1-r1.ebuild              | 148 +++++++++++++++++++++
 5 files changed, 385 insertions(+)

diff --git a/sys-fs/udisks/files/udisks-2.10.1-BLKRRPART_harder.patch 
b/sys-fs/udisks/files/udisks-2.10.1-BLKRRPART_harder.patch
new file mode 100644
index 000000000000..39af1e0fe5b3
--- /dev/null
+++ b/sys-fs/udisks/files/udisks-2.10.1-BLKRRPART_harder.patch
@@ -0,0 +1,55 @@
+From eb1d4a2bcbb8744074d17553bd0d55ffbd76bdeb Mon Sep 17 00:00:00 2001
+From: Tomas Bzatek <[email protected]>
+Date: Tue, 14 Nov 2023 13:16:39 +0000
+Subject: [PATCH] udiskslinuxblockobject: Try issuing BLKRRPART ioctl harder
+
+For some reason even after acquiring a voluntary BSD lock on
+the device the BLKRRPART ioctl still fails with EBUSY. Wait
+a couple of msec and everything is fine.
+
+So try harder, several attempts, if busy. There might be number
+of things going on in the system and it's out of our control
+even when holding a lock.
+---
+ src/udiskslinuxblockobject.c | 14 +++++++++++---
+ 1 file changed, 11 insertions(+), 3 deletions(-)
+
+diff --git a/src/udiskslinuxblockobject.c b/src/udiskslinuxblockobject.c
+index d5da4bc4d9..33604df841 100644
+--- a/src/udiskslinuxblockobject.c
++++ b/src/udiskslinuxblockobject.c
+@@ -1098,23 +1098,31 @@ udisks_linux_block_object_reread_partition_table 
(UDisksLinuxBlockObject  *objec
+     }
+   else
+     {
+-      gint num_tries = 0;
++      gint num_tries;
+ 
+       /* acquire an exclusive BSD lock to prevent udev probes.
+        * See also https://systemd.io/BLOCK_DEVICE_LOCKING
+        */
++      num_tries = 10;
+       while (flock (fd, LOCK_EX | LOCK_NB) != 0)
+         {
+           g_usleep (100 * 1000); /* microseconds */
+-          if (num_tries++ > 5)
++          if (num_tries-- < 0)
+             break;
+         }
+ 
+-      if (ioctl (fd, BLKRRPART) != 0)
++      num_tries = 5;
++      while (ioctl (fd, BLKRRPART) != 0)
+         {
++          if (errno == EBUSY && num_tries-- >= 0)
++            {
++              g_usleep (200 * 1000); /* microseconds */
++              continue;
++            }
+           g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errno),
+                        "Error re-reading partition table (BLKRRPART ioctl) on 
%s: %m", device_file);
+           ret = FALSE;
++          break;
+         }
+       close (fd);
+     }

diff --git 
a/sys-fs/udisks/files/udisks-2.10.1-targetcli_config.json_netif_timeout.patch 
b/sys-fs/udisks/files/udisks-2.10.1-targetcli_config.json_netif_timeout.patch
new file mode 100644
index 000000000000..e40f136dfe2d
--- /dev/null
+++ 
b/sys-fs/udisks/files/udisks-2.10.1-targetcli_config.json_netif_timeout.patch
@@ -0,0 +1,38 @@
+From acae6bf4594f80da57855343ab325f87386178c4 Mon Sep 17 00:00:00 2001
+From: Tomas Bzatek <[email protected]>
+Date: Fri, 3 Nov 2023 16:40:54 +0100
+Subject: [PATCH] tests: Fix targetcli_config.json
+
+Not all attributes are available anymore in newer kernel versions.
+---
+ src/tests/dbus-tests/targetcli_config.json | 3 ---
+ 1 file changed, 3 deletions(-)
+
+diff --git a/src/tests/dbus-tests/targetcli_config.json 
b/src/tests/dbus-tests/targetcli_config.json
+index 3be9eac2be..f50bf7d4d2 100644
+--- a/src/tests/dbus-tests/targetcli_config.json
++++ b/src/tests/dbus-tests/targetcli_config.json
+@@ -331,7 +331,6 @@
+             "demo_mode_write_protect": 0,
+             "generate_node_acls": 1,
+             "login_timeout": 15,
+-            "netif_timeout": 2,
+             "prod_mode_write_protect": 0,
+             "t10_pi": 0,
+             "tpg_enabled_sendtargets": 1
+@@ -393,7 +392,6 @@
+             "demo_mode_write_protect": 1,
+             "generate_node_acls": 0,
+             "login_timeout": 15,
+-            "netif_timeout": 2,
+             "prod_mode_write_protect": 0,
+             "t10_pi": 0,
+             "tpg_enabled_sendtargets": 1
+@@ -479,7 +477,6 @@
+             "demo_mode_write_protect": 1,
+             "generate_node_acls": 0,
+             "login_timeout": 15,
+-            "netif_timeout": 2,
+             "prod_mode_write_protect": 0,
+             "t10_pi": 0,
+             "tpg_enabled_sendtargets": 1

diff --git 
a/sys-fs/udisks/files/udisks-2.10.1-udiskslinuxblock_survive_missing_fstab.patch
 
b/sys-fs/udisks/files/udisks-2.10.1-udiskslinuxblock_survive_missing_fstab.patch
new file mode 100644
index 000000000000..9acd8bd10331
--- /dev/null
+++ 
b/sys-fs/udisks/files/udisks-2.10.1-udiskslinuxblock_survive_missing_fstab.patch
@@ -0,0 +1,32 @@
+From 8f62f7c6888659f3b66d5861d46fb9b3a34ff169 Mon Sep 17 00:00:00 2001
+From: Marius Vollmer <[email protected]>
+Date: Thu, 22 Feb 2024 16:49:24 +0200
+Subject: [PATCH] udiskslinuxblock: Survive a missing /etc/fstab
+
+This is similar to b79f6840ca82551e672156153b7e13328f0ba19d, which
+solved the same problem for /etc/crypttab.
+---
+ src/udiskslinuxblock.c | 10 +++++++++-
+ 1 file changed, 9 insertions(+), 1 deletion(-)
+
+diff --git a/src/udiskslinuxblock.c b/src/udiskslinuxblock.c
+index 829dd5f78..a3fa183be 100644
+--- a/src/udiskslinuxblock.c
++++ b/src/udiskslinuxblock.c
+@@ -1541,7 +1541,15 @@ add_remove_fstab_entry (UDisksBlock *block,
+                             &contents,
+                             NULL,
+                             error))
+-    goto out;
++    {
++      if (g_error_matches (*error, G_FILE_ERROR, G_FILE_ERROR_NOENT))
++        {
++          contents = g_strdup ("");
++          g_clear_error (error);
++        }
++      else
++        goto out;
++    }
+ 
+   lines = g_strsplit (contents, "\n", 0);
+ 

diff --git 
a/sys-fs/udisks/files/udisks-2.10.1-udiskslinuxmanager_use_after_free.patch 
b/sys-fs/udisks/files/udisks-2.10.1-udiskslinuxmanager_use_after_free.patch
new file mode 100644
index 000000000000..3157b10f8c87
--- /dev/null
+++ b/sys-fs/udisks/files/udisks-2.10.1-udiskslinuxmanager_use_after_free.patch
@@ -0,0 +1,112 @@
+From 3dc036fb5045fc068c6abfbe4e62d0871d7ca82a Mon Sep 17 00:00:00 2001
+From: xinpeng wang <[email protected]>
+Date: Thu, 21 Sep 2023 13:57:40 +0800
+Subject: [PATCH] udiskslinuxmanager:use dbus interface after free
+
+In handle_get_block_devices, call get_block_objects to obtain 
iface_block_device
+of all current UDisksLinuxBlockObject, and then obtain the corresponding
+UDisksLinuxBlockObject's object_path through 
iface_block_device.iface_block_device
+is a GDBusInterfaceSkeleton, which saves the object through
+g_dbus_interface_skeleton_set_object. g_object_add_weak_pointer is used here. 
This
+function is not thread-safe.At this time, if other threads are releasing the 
object,
+the program will crash.
+This scene can be reproduced by quickly plugging and unplugging the USB disk.
+The core is as follows (the redundant stack is omitted):
+When accessing object in thread 1, the object is released by thread 2
+info threads
+   Id Target Id Frame
+* 1 Thread 0x7f80979e70 (LWP 24559) 0x0000007f8a48dda0 in
+g_dbus_object_get_object_path (object=0x0) at ../../../gio/gdbusobject.c:109
+  2 Thread 0x7f88a43010 (LWP 1159) 0x0000007f8a0a6ae8 in __GI___libc_free
+(mem=0x556a919c80) at malloc.c:3093
+
+thread 1
+(gdb) bt
+0 0x0000007f8a48dda0 in g_dbus_object_get_object_path (object=0x0) at
+../../../gio/gdbusobject.c:109
+1 0x000000556a56911c in handle_get_block_devices (object=0x7f7c007ed0, 
invocation=
+0x7f74016f20 [GDBusMethodInvocation], arg_options=<optimized out>)
+     at udiskslinuxmanager.c:1063
+
+(gdb) p ((GObject*)(blocks_p->data))->ref_count
+$3 = 1
+(gdb) p *((GDBusInterfaceSkeleton*)(blocks_p->data))
+$6 = {parent_instance = {g_type_instance = {g_class = 0x556a64e740
+[g_type: UDisksLinuxBlock/UDisksBlockSkeleton/GDBusInterfaceSkeleton]}, 
ref_count = 1,
+qdata = 0x0},  priv = 0x7f7c004ac0}
+(gdb) p *((GDBusInterfaceSkeleton*)(blocks_p->data))->priv
+$7 = {lock = {p = 0x0, i = {0, 0}}, object = 0x0,
+flags = G_DBUS_INTERFACE_SKELETON_FLAGS_HANDLE_METHOD_INVOCATIONS_IN_THREAD,
+connections = 0x0, object_path = 0x0, hooked_vtable = 0x556a62b9f0}
+
+thread 2
+(gdb) bt
+0 0x0000007f8a0a6ae8 in __GI___libc_free (mem=0x556a919c80) at malloc.c:3093
+1 0x0000007f89ff1224 in () at /lib/aarch64-linux-gnu/libudev.so.1
+2 0x0000007f89ff1348 in () at /lib/aarch64-linux-gnu/libudev.so.1
+3 0x0000007f89ff5520 in () at /lib/aarch64-linux-gnu/libudev.so.1
+4 0x0000007f89fff878 in udev_device_unref () at 
/lib/aarch64-linux-gnu/libudev.so.1
+5 0x0000007f8a7aeb74 in () at /lib/aarch64-linux-gnu/libgudev-1.0.so.0
+6 0x0000007f8a3193f8 in g_object_unref (_object=<optimized out>) at
+../../../gobject/gobject.c:3346
+7 0x0000007f8a3193f8 in g_object_unref (_object=0x7f680038a0) at
+../../../gobject/gobject.c:3238
+8 0x000000556a57700c in udisks_linux_device_finalize (object=0x7f5c005730
+[UDisksLinuxDevice]) at udiskslinuxdevice.c:75
+9 0x0000007f8a3193f8 in g_object_unref (_object=<optimized out>) at
+../../../gobject/gobject.c:3346
+10 0x0000007f8a3193f8 in g_object_unref (_object=0x7f5c005730) at
+../../../gobject/gobject.c:3238
+11 0x000000556a55d0fc in udisks_linux_drive_object_uevent
+     (object=object@entry=0x556a5df370 [UDisksLinuxDriveObject],
+action=action@entry=0x556a87b120
+"remove",device=device@entry=0x7f74007610 [UDisksLinuxDevice])
+     at udiskslinuxdriveobject.c:715
+12 0x000000556a54840c in handle_block_uevent_for_drive
+     (provider=provider@entry=0x556a5c8200 [UDisksLinuxProvider],
+action=action@entry=0x556a87b120 "remove",device=device@entry=0x7f74007610
+[UDisksLinuxDevice]) at udiskslinuxprovider.c:1035
+13 0x000000556a548ab8 in handle_block_uevent (device=0x7f74007610 
[UDisksLinuxDevice],
+action=0x556a87b120 "remove", provider=0x556a5c8200 [UDisksLinuxProvider]) at
+udiskslinuxprovider.c:1349
+14 0x000000556a548ab8 in udisks_linux_provider_handle_uevent
+     (provider=0x556a5c8200 [UDisksLinuxProvider], action=0x556a87b120 
"remove",
+device=0x7f74007610 [UDisksLinuxDevice]) at udiskslinuxprovider.c:1399
+15 0x000000556a548cac in on_idle_with_probed_uevent (user_data=0x556a7e65a0) at
+udiskslinuxprovider.c:230
+---
+ src/udiskslinuxmanager.c | 13 +++++++++----
+ 1 file changed, 9 insertions(+), 4 deletions(-)
+
+diff --git a/src/udiskslinuxmanager.c b/src/udiskslinuxmanager.c
+index 5bfeec103..491edb92b 100644
+--- a/src/udiskslinuxmanager.c
++++ b/src/udiskslinuxmanager.c
+@@ -1196,8 +1196,11 @@ handle_get_block_devices (UDisksManager         *object,
+   blocks = get_block_objects (object, &num_blocks);
+   block_paths = g_new0 (const gchar *, num_blocks + 1);
+ 
+-  for (i = 0,blocks_p = blocks; blocks_p != NULL; blocks_p = blocks_p->next, 
i++)
+-      block_paths[i] = g_dbus_object_get_object_path 
(g_dbus_interface_get_object (G_DBUS_INTERFACE (blocks_p->data)));
++  for (blocks_p = blocks; blocks_p != NULL; blocks_p = blocks_p->next) {
++        GDBusObject * block_object = g_dbus_interface_get_object 
(G_DBUS_INTERFACE (blocks_p->data));
++        if (block_object)
++                block_paths[i++] = g_dbus_object_get_object_path 
(block_object);
++  }
+ 
+   udisks_manager_complete_get_block_devices  (object,
+                                               invocation,
+@@ -1284,9 +1287,11 @@ handle_resolve_device (UDisksManager         *object,
+     }
+ 
+   ret_paths = g_new0 (const gchar *, num_found + 1);
+-  for (i = 0,ret_p = ret; ret_p != NULL; ret_p = ret_p->next, i++)
++  for (i = 0,ret_p = ret; ret_p != NULL; ret_p = ret_p->next)
+     {
+-      ret_paths[i] = g_dbus_object_get_object_path 
(g_dbus_interface_get_object (G_DBUS_INTERFACE (ret_p->data)));
++      GDBusObject *block_object = g_dbus_interface_get_object 
(G_DBUS_INTERFACE (ret_p->data));
++      if (block_object)
++        ret_paths[i++] = g_dbus_object_get_object_path (block_object);
+     }
+ 
+   udisks_manager_complete_resolve_device (object,

diff --git a/sys-fs/udisks/udisks-2.10.1-r1.ebuild 
b/sys-fs/udisks/udisks-2.10.1-r1.ebuild
new file mode 100644
index 000000000000..d2f4f213c1bb
--- /dev/null
+++ b/sys-fs/udisks/udisks-2.10.1-r1.ebuild
@@ -0,0 +1,148 @@
+# Copyright 1999-2024 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+inherit autotools bash-completion-r1 linux-info systemd tmpfiles udev xdg-utils
+
+DESCRIPTION="Daemon providing interfaces to work with storage devices"
+HOMEPAGE="https://www.freedesktop.org/wiki/Software/udisks";
+SRC_URI="https://github.com/storaged-project/udisks/releases/download/${P}/${P}.tar.bz2";
+
+LICENSE="LGPL-2+ GPL-2+"
+SLOT="2"
+KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~loong ~mips ~ppc64 ~riscv ~x86"
+IUSE="acl +daemon debug elogind +introspection lvm nls selinux systemd"
+
+REQUIRED_USE="
+       ?? ( elogind systemd )
+       elogind? ( daemon )
+       systemd? ( daemon )
+"
+
+# See configure.ac file for the required min version
+BLOCKDEV_MIN_VER="3.0"
+
+COMMON_DEPEND="
+       >=sys-auth/polkit-0.114[daemon]
+       >=sys-libs/libblockdev-${BLOCKDEV_MIN_VER}:=[cryptsetup,lvm?,nvme]
+       virtual/udev
+       acl? ( virtual/acl )
+       daemon? (
+               >=dev-libs/glib-2.68:2
+               >=dev-libs/libatasmart-0.19
+               >=dev-libs/libgudev-165:=
+       )
+       elogind? ( >=sys-auth/elogind-219 )
+       introspection? ( >=dev-libs/gobject-introspection-1.30:= )
+       lvm? ( sys-fs/lvm2 )
+       systemd? ( >=sys-apps/systemd-209 )
+"
+# util-linux -> mount, umount, swapon, swapoff (see also #403073)
+RDEPEND="${COMMON_DEPEND}
+       >=sys-block/parted-3
+       >=sys-apps/util-linux-2.30
+       selinux? ( sec-policy/selinux-devicekit )
+"
+DEPEND="${COMMON_DEPEND}
+       >=sys-kernel/linux-headers-3.1
+"
+BDEPEND="
+       app-text/docbook-xsl-stylesheets
+       >=dev-util/gdbus-codegen-2.32
+       >=dev-build/gtk-doc-am-1.3
+       virtual/pkgconfig
+       nls? ( >=sys-devel/gettext-0.19.8 )
+       dev-libs/gobject-introspection-common
+       dev-build/autoconf-archive
+"
+# If adding a eautoreconf, then these might be needed at buildtime:
+# dev-libs/gobject-introspection-common
+# dev-build/autoconf-archive
+
+DOCS=( AUTHORS HACKING NEWS README.md )
+
+PATCHES=(
+       "${FILESDIR}"/${P}-BLKRRPART_harder.patch
+       "${FILESDIR}"/${P}-targetcli_config.json_netif_timeout.patch
+       "${FILESDIR}"/${P}-udiskslinuxmanager_use_after_free.patch
+       "${FILESDIR}"/${P}-udiskslinuxblock_survive_missing_fstab.patch
+)
+
+pkg_setup() {
+       # Listing only major arch's here to avoid tracking kernel's defconfig
+       if use amd64 || use arm || use ppc || use ppc64 || use x86; then
+               CONFIG_CHECK="~!IDE" #319829
+               CONFIG_CHECK+=" ~TMPFS_POSIX_ACL" #412377
+               CONFIG_CHECK+=" ~NLS_UTF8" #425562
+               kernel_is lt 3 10 && CONFIG_CHECK+=" ~USB_SUSPEND" #331065, 
#477278
+               linux-info_pkg_setup
+       fi
+}
+
+src_prepare() {
+       xdg_environment_reset
+       default
+
+       if ! use systemd ; then
+               sed -i -e 's:libsystemd-login:&disable:' configure || die
+       fi
+
+       # Added for bug # 782061
+       eautoreconf
+}
+
+src_configure() {
+       local myeconfargs=(
+               --enable-btrfs
+               --disable-gtk-doc
+               --disable-static
+               --localstatedir="${EPREFIX}"/var
+               --with-html-dir="${EPREFIX}"/usr/share/gtk-doc/html
+               --with-modprobedir="${EPREFIX}"/lib/modprobe.d
+               --with-systemdsystemunitdir="$(systemd_get_systemunitdir)"
+               --with-tmpfilesdir="${EPREFIX}"/usr/lib/tmpfiles.d
+               --with-udevdir="${EPREFIX}$(get_udevdir)"
+               $(use_enable acl)
+               $(use_enable daemon)
+               $(use_enable debug)
+               $(use_enable introspection)
+               $(use_enable lvm lvm2)
+               $(use_enable nls)
+       )
+       econf "${myeconfargs[@]}"
+}
+
+src_install() {
+       default
+       find "${ED}" -type f -name "*.la" -delete || die
+       keepdir /var/lib/udisks2 #383091
+
+       rm -rf "${ED}"/usr/share/bash-completion
+       dobashcomp data/completions/udisksctl
+}
+
+pkg_preinst() {
+       # Remove gtk-doc symlink, #597628
+       if [[ -L "${EROOT}"/usr/share/gtk-doc/html/udisks2 ]]; then
+               rm "${EROOT}"/usr/share/gtk-doc/html/udisks2 || die
+       fi
+}
+
+pkg_postinst() {
+       udev_reload
+
+       # TODO: obsolete with tmpfiles_process?
+       # mkdir -p "${EROOT}"/run #415987
+
+       tmpfiles_process udisks2.conf
+
+       # See pkg_postinst() of >=sys-apps/baselayout-2.1-r1. Keep in sync?
+       if ! grep -qs "^tmpfs.*/run " "${EROOT}"/proc/mounts ; then
+               echo
+               ewarn "You should reboot the system now to get /run mounted 
with tmpfs!"
+       fi
+}
+
+pkg_postrm() {
+       udev_reload
+}

Reply via email to