From 5ce41697bd3ddc19cd6e1e6834751082ca0c8b02 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Wed, 6 Feb 2019 08:36:48 +0100 Subject: [PATCH 1/2] sd-device: fix device_copy_properties() This fixes a bug introduced by a3ce813697bcc1c4644e097a2f1cd0459326d6ee. Fixes #11652. --- src/libsystemd/sd-device/device-private.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libsystemd/sd-device/device-private.c b/src/libsystemd/sd-device/device-private.c index 2daf4ddd57..76267a1e74 100644 --- a/src/libsystemd/sd-device/device-private.c +++ b/src/libsystemd/sd-device/device-private.c @@ -712,13 +712,13 @@ int device_copy_properties(sd_device *device_dst, sd_device *device_src) { if (r < 0) return r; - ORDERED_HASHMAP_FOREACH_KEY(property, value, device_src->properties_db, i) { + ORDERED_HASHMAP_FOREACH_KEY(value, property, device_src->properties_db, i) { r = device_add_property_aux(device_dst, property, value, true); if (r < 0) return r; } - ORDERED_HASHMAP_FOREACH_KEY(property, value, device_src->properties, i) { + ORDERED_HASHMAP_FOREACH_KEY(value, property, device_src->properties, i) { r = device_add_property_aux(device_dst, property, value, false); if (r < 0) return r; From 9ffb90964f16d730d495ff160e63a24b482ec898 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Wed, 6 Feb 2019 08:43:34 +0100 Subject: [PATCH 2/2] test: add a test case for issue #11652 --- src/libsystemd/sd-device/test-sd-device-monitor.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/libsystemd/sd-device/test-sd-device-monitor.c b/src/libsystemd/sd-device/test-sd-device-monitor.c index 287100d5d3..aa1edaaf3c 100644 --- a/src/libsystemd/sd-device/test-sd-device-monitor.c +++ b/src/libsystemd/sd-device/test-sd-device-monitor.c @@ -157,6 +157,15 @@ static void test_sd_device_monitor_filter_remove(sd_device *device) { assert_se(sd_event_loop(sd_device_monitor_get_event(monitor_client)) == 100); } +static void test_device_copy_properties(sd_device *device) { + _cleanup_(sd_device_unrefp) sd_device *copy = NULL; + + assert_se(device_shallow_clone(device, ©) >= 0); + assert_se(device_copy_properties(copy, device) >= 0); + + test_send_receive_one(copy, false, false, false); +} + int main(int argc, char *argv[]) { _cleanup_(sd_device_unrefp) sd_device *loopback = NULL, *sda = NULL; int r; @@ -186,6 +195,7 @@ int main(int argc, char *argv[]) { test_subsystem_filter(loopback); test_sd_device_monitor_filter_remove(loopback); + test_device_copy_properties(loopback); r = sd_device_new_from_subsystem_sysname(&sda, "block", "sda"); if (r < 0) {