forked from gentoo/gentoo
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
sys-fs/udisks: Multiple bugfixes from upstream
Signed-off-by: Pacho Ramos <[email protected]>
- Loading branch information
Showing
5 changed files
with
385 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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); | ||
} |
38 changes: 38 additions & 0 deletions
38
sys-fs/udisks/files/udisks-2.10.1-targetcli_config.json_netif_timeout.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |
32 changes: 32 additions & 0 deletions
32
sys-fs/udisks/files/udisks-2.10.1-udiskslinuxblock_survive_missing_fstab.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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); | ||
|
112 changes: 112 additions & 0 deletions
112
sys-fs/udisks/files/udisks-2.10.1-udiskslinuxmanager_use_after_free.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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, |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 | ||
} |