On Thu, Mar 21, 2019 at 05:53:52PM +0100, Michael Biebl wrote: > Am 21.03.19 um 03:58 schrieb Celelibi: > > It looks like it's actually already fixed upstream. > > https://github.com/systemd/systemd/issues/11368 > > Fixed by the commit: > > https://github.com/systemd/systemd/commit/39a15c8a8dad26deda140867f03e44a535b7bd8d > > This sounds like something that should be fixed for buster. > > >> Versions of packages udev is related to: > >> ii systemd 241-1 > > > > By looking at the debian source, it looks like it's also fixed in 242-2. > > I'll test it when I can, but I think it should work. > > > > I guess you mean 241-2, as there is no 242-2 (yet). > 241-2 does not contain that upstream fix.
I thought it was. But now, I think I may have confused my terminals while checking 3 versions in parallel. It indeed doesn't seem to be fixed yet in 241-2. > > Would be great if you test a package with this fix applied and confirm > the fix. I applied the commit 39a15c8a8dad26deda140867f03e44a535b7bd8d on top of the debian source 241-2. As far as I can tell, it seems to work. I join the patch as generated from: $ git format-patch -1 39a15c8a8d Note that some hunks apply with an offset. But nontheless, it applies and work. Best regards, Celelibi
>From 39a15c8a8dad26deda140867f03e44a535b7bd8d Mon Sep 17 00:00:00 2001 From: Yu Watanabe <watanabe.yu+git...@gmail.com> Date: Tue, 5 Mar 2019 04:01:34 +0900 Subject: [PATCH] udev: run programs in the specified order This fixes bugs introduced by 29448498c724da7ade1b5efb20d7472c1b128d2c and d838e14515c82b05a07f2bf393cce057b45b2b53. Previously, RUN and SECLABEL keys are stored in udev_list with its unique flag is false. If the flag is false, then udev_list is just a linked list and new entries are always added in the last. So, we should use OrderedHashmap instead of Hashmap. Fixes #11368. --- src/udev/udev-event.c | 6 +++--- src/udev/udev-node.c | 6 +++--- src/udev/udev-node.h | 2 +- src/udev/udev-rules.c | 12 ++++++------ src/udev/udev.h | 4 ++-- src/udev/udevadm-test.c | 2 +- 6 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/udev/udev-event.c b/src/udev/udev-event.c index 6f90516ff6..9ede330c27 100644 --- a/src/udev/udev-event.c +++ b/src/udev/udev-event.c @@ -71,8 +71,8 @@ UdevEvent *udev_event_free(UdevEvent *event) { sd_device_unref(event->dev); sd_device_unref(event->dev_db_clone); sd_netlink_unref(event->rtnl); - hashmap_free_free_key(event->run_list); - hashmap_free_free_free(event->seclabel_list); + ordered_hashmap_free_free_key(event->run_list); + ordered_hashmap_free_free_free(event->seclabel_list); free(event->program_result); free(event->name); @@ -891,7 +891,7 @@ void udev_event_execute_run(UdevEvent *event, usec_t timeout_usec) { void *val; Iterator i; - HASHMAP_FOREACH_KEY(val, cmd, event->run_list, i) { + ORDERED_HASHMAP_FOREACH_KEY(val, cmd, event->run_list, i) { enum udev_builtin_cmd builtin_cmd = PTR_TO_INT(val); char command[UTIL_PATH_SIZE]; diff --git a/src/udev/udev-node.c b/src/udev/udev-node.c index 1c00dd1e9e..cfbbd7b283 100644 --- a/src/udev/udev-node.c +++ b/src/udev/udev-node.c @@ -272,7 +272,7 @@ int udev_node_update_old_links(sd_device *dev, sd_device *dev_old) { static int node_permissions_apply(sd_device *dev, bool apply, mode_t mode, uid_t uid, gid_t gid, - Hashmap *seclabel_list) { + OrderedHashmap *seclabel_list) { const char *devnode, *subsystem, *id_filename = NULL; struct stat stats; dev_t devnum; @@ -318,7 +318,7 @@ static int node_permissions_apply(sd_device *dev, bool apply, log_device_debug(dev, "Preserve permissions of %s, %#o, uid=%u, gid=%u", devnode, mode, uid, gid); /* apply SECLABEL{$module}=$label */ - HASHMAP_FOREACH_KEY(label, name, seclabel_list, i) { + ORDERED_HASHMAP_FOREACH_KEY(label, name, seclabel_list, i) { int q; if (streq(name, "selinux")) { @@ -386,7 +386,7 @@ static int xsprintf_dev_num_path_from_sd_device(sd_device *dev, char **ret) { int udev_node_add(sd_device *dev, bool apply, mode_t mode, uid_t uid, gid_t gid, - Hashmap *seclabel_list) { + OrderedHashmap *seclabel_list) { const char *devnode, *devlink; _cleanup_free_ char *filename = NULL; int r; diff --git a/src/udev/udev-node.h b/src/udev/udev-node.h index 223c8f0e43..5ae816d66f 100644 --- a/src/udev/udev-node.h +++ b/src/udev/udev-node.h @@ -10,6 +10,6 @@ int udev_node_add(sd_device *dev, bool apply, mode_t mode, uid_t uid, gid_t gid, - Hashmap *seclabel_list); + OrderedHashmap *seclabel_list); int udev_node_remove(sd_device *dev); int udev_node_update_old_links(sd_device *dev, sd_device *dev_old); diff --git a/src/udev/udev-rules.c b/src/udev/udev-rules.c index 178a41906f..0fb515e134 100644 --- a/src/udev/udev-rules.c +++ b/src/udev/udev-rules.c @@ -2260,13 +2260,13 @@ int udev_rules_apply_to_event( return log_oom(); if (IN_SET(cur->key.op, OP_ASSIGN, OP_ASSIGN_FINAL)) - hashmap_clear_free_free(event->seclabel_list); + ordered_hashmap_clear_free_free(event->seclabel_list); - r = hashmap_ensure_allocated(&event->seclabel_list, NULL); + r = ordered_hashmap_ensure_allocated(&event->seclabel_list, NULL); if (r < 0) return log_oom(); - r = hashmap_put(event->seclabel_list, name, label); + r = ordered_hashmap_put(event->seclabel_list, name, label); if (r < 0) return log_oom(); log_device_debug(dev, "SECLABEL{%s}='%s' %s:%u", @@ -2443,9 +2443,9 @@ int udev_rules_apply_to_event( _cleanup_free_ char *cmd = NULL; if (IN_SET(cur->key.op, OP_ASSIGN, OP_ASSIGN_FINAL)) - hashmap_clear_free_key(event->run_list); + ordered_hashmap_clear_free_key(event->run_list); - r = hashmap_ensure_allocated(&event->run_list, NULL); + r = ordered_hashmap_ensure_allocated(&event->run_list, NULL); if (r < 0) return log_oom(); @@ -2453,7 +2453,7 @@ int udev_rules_apply_to_event( if (!cmd) return log_oom(); - r = hashmap_put(event->run_list, cmd, INT_TO_PTR(cur->key.builtin_cmd)); + r = ordered_hashmap_put(event->run_list, cmd, INT_TO_PTR(cur->key.builtin_cmd)); if (r < 0) return log_oom(); diff --git a/src/udev/udev.h b/src/udev/udev.h index 3bc69ff6c4..2fb49dc974 100644 --- a/src/udev/udev.h +++ b/src/udev/udev.h @@ -25,8 +25,8 @@ typedef struct UdevEvent { mode_t mode; uid_t uid; gid_t gid; - Hashmap *seclabel_list; - Hashmap *run_list; + OrderedHashmap *seclabel_list; + OrderedHashmap *run_list; usec_t exec_delay_usec; usec_t birth_usec; sd_netlink *rtnl; diff --git a/src/udev/udevadm-test.c b/src/udev/udevadm-test.c index 54c525e02c..9c1784489a 100644 --- a/src/udev/udevadm-test.c +++ b/src/udev/udevadm-test.c @@ -135,7 +135,7 @@ int test_main(int argc, char *argv[], void *userdata) { FOREACH_DEVICE_PROPERTY(dev, key, value) printf("%s=%s\n", key, value); - HASHMAP_FOREACH_KEY(val, cmd, event->run_list, i) { + ORDERED_HASHMAP_FOREACH_KEY(val, cmd, event->run_list, i) { char program[UTIL_PATH_SIZE]; udev_event_apply_format(event, cmd, program, sizeof(program), false); -- 2.20.1