From 779c923467beb209549aaa2ba2d6388c91e201b9 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sun, 25 Nov 2018 14:06:27 +0900 Subject: [PATCH 1/6] sd-device: fix return value on error path --- src/libsystemd/sd-device/device-monitor.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libsystemd/sd-device/device-monitor.c b/src/libsystemd/sd-device/device-monitor.c index 05e7ec0715..dd312e91ce 100644 --- a/src/libsystemd/sd-device/device-monitor.c +++ b/src/libsystemd/sd-device/device-monitor.c @@ -246,7 +246,7 @@ _public_ int sd_device_monitor_attach_event(sd_device_monitor *m, sd_event *even else { r = sd_event_default(&m->event); if (r < 0) - return 0; + return r; } return 0; From 5cee547a94716dc38dffc49d907cc9bc1e221298 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sun, 25 Nov 2018 14:06:56 +0900 Subject: [PATCH 2/6] sd-device: update log message --- src/libsystemd/sd-device/device-monitor.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libsystemd/sd-device/device-monitor.c b/src/libsystemd/sd-device/device-monitor.c index dd312e91ce..aaf4f3889b 100644 --- a/src/libsystemd/sd-device/device-monitor.c +++ b/src/libsystemd/sd-device/device-monitor.c @@ -277,7 +277,7 @@ int device_monitor_enable_receiving(sd_device_monitor *m) { if (!m->bound) { if (bind(m->sock, &m->snl.sa, sizeof(struct sockaddr_nl)) < 0) - return log_debug_errno(errno, "sd-device-monitor: Failed to bind monitoring socket to event source: %m"); + return log_debug_errno(errno, "sd-device-monitor: Failed to bind monitoring socket: %m"); m->bound = true; } From f1d7b7874ed6da76ccd8a29c9af9b20a33447fad Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sun, 25 Nov 2018 14:44:46 +0900 Subject: [PATCH 3/6] sd-device: check whether filter is updated or not in sd_device_monitor_filter_update() --- src/libsystemd/sd-device/device-monitor.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/libsystemd/sd-device/device-monitor.c b/src/libsystemd/sd-device/device-monitor.c index aaf4f3889b..ff0fdbc93e 100644 --- a/src/libsystemd/sd-device/device-monitor.c +++ b/src/libsystemd/sd-device/device-monitor.c @@ -269,11 +269,9 @@ int device_monitor_enable_receiving(sd_device_monitor *m) { assert_return(m, -EINVAL); - if (!m->filter_uptodate) { - r = sd_device_monitor_filter_update(m); - if (r < 0) - return log_debug_errno(r, "sd-device-monitor: Failed to update filter: %m"); - } + r = sd_device_monitor_filter_update(m); + if (r < 0) + return log_debug_errno(r, "sd-device-monitor: Failed to update filter: %m"); if (!m->bound) { if (bind(m->sock, &m->snl.sa, sizeof(struct sockaddr_nl)) < 0) @@ -595,6 +593,9 @@ _public_ int sd_device_monitor_filter_update(sd_device_monitor *m) { assert_return(m, -EINVAL); + if (m->filter_uptodate) + return 0; + if (hashmap_isempty(m->subsystem_filter) && set_isempty(m->tag_filter)) { m->filter_uptodate = true; From 916707cca56ac73c81d10c41b6d7f0800663fc29 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sun, 25 Nov 2018 14:52:24 +0900 Subject: [PATCH 4/6] sd-device: do not call device_monitor_enable_receiving() for passed fd from pid1 Before c4b69e990f962128cc6975e36e91e9ad838fa2c4, if the socket fd is passed from pid1, `udev_monitor_enable_receiving()` (now it is a wrapper of `device_monitor_enable_receiving`) was not called. Let's preserve the original logic. Fixes #10754. --- src/libsystemd/sd-device/device-monitor.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/libsystemd/sd-device/device-monitor.c b/src/libsystemd/sd-device/device-monitor.c index ff0fdbc93e..8f2eec1bda 100644 --- a/src/libsystemd/sd-device/device-monitor.c +++ b/src/libsystemd/sd-device/device-monitor.c @@ -210,9 +210,11 @@ _public_ int sd_device_monitor_start(sd_device_monitor *m, sd_device_monitor_han return r; } - r = device_monitor_enable_receiving(m); - if (r < 0) - return r; + if (!m->bound) { + r = device_monitor_enable_receiving(m); + if (r < 0) + return r; + } m->callback = callback; m->userdata = userdata; From 986ab0d2dc161dfa026e8fc7a609f9efb8cb4397 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sun, 25 Nov 2018 15:04:26 +0900 Subject: [PATCH 5/6] udevd: do not set buffer size if the socket is passed from pid1 Before c4b69e990f962128cc6975e36e91e9ad838fa2c4, if the socket fd is passed from pid1, `udev_monitor_set_receive_buffer_size()` (now it is a wrapper of `sd_device_monitor_set_receive_buffer_size()`) was not called. Let's preserve the original logic. --- src/udev/udevd.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/udev/udevd.c b/src/udev/udevd.c index 6eacfe811f..aeec7fa77c 100644 --- a/src/udev/udevd.c +++ b/src/udev/udevd.c @@ -1629,7 +1629,8 @@ static int manager_new(Manager **ret, int fd_ctrl, int fd_uevent, const char *cg if (r < 0) return log_error_errno(r, "Failed to initialize device monitor: %m"); - (void) sd_device_monitor_set_receive_buffer_size(manager->monitor, 128 * 1024 * 1024); + if (fd_uevent < 0) + (void) sd_device_monitor_set_receive_buffer_size(manager->monitor, 128 * 1024 * 1024); /* unnamed socket from workers to the main daemon */ r = socketpair(AF_LOCAL, SOCK_DGRAM|SOCK_CLOEXEC, 0, manager->worker_watch); From 6acf1ccba5ef1741649bf858fac5afabb2328fff Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 26 Nov 2018 11:57:48 +0900 Subject: [PATCH 6/6] udevd: do not call udev_ctrl_enable_receiving() if the socket is passed from pid1 Before c4b69e990f962128cc6975e36e91e9ad838fa2c4, if the socket fd is passed from pid1, `udev_ctrl_enable_receiving()` was not called. Let's preserve the original logic. --- src/udev/udevd.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/udev/udevd.c b/src/udev/udevd.c index aeec7fa77c..3b15beb4b3 100644 --- a/src/udev/udevd.c +++ b/src/udev/udevd.c @@ -1617,9 +1617,11 @@ static int manager_new(Manager **ret, int fd_ctrl, int fd_uevent, const char *cg if (!manager->ctrl) return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Failed to initialize udev control socket"); - r = udev_ctrl_enable_receiving(manager->ctrl); - if (r < 0) - return log_error_errno(r, "Failed to bind udev control socket: %m"); + if (fd_ctrl < 0) { + r = udev_ctrl_enable_receiving(manager->ctrl); + if (r < 0) + return log_error_errno(r, "Failed to bind udev control socket: %m"); + } fd_ctrl = udev_ctrl_get_fd(manager->ctrl); if (fd_ctrl < 0)