From a153a1de757c1b85a3493c1581f45413b9782a3c Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sat, 8 Dec 2018 18:41:29 +0900 Subject: [PATCH 1/3] Revert "sd-device: do not call device_monitor_enable_receiving() for passed fd from pid1" This reverts commit 916707cca56ac73c81d10c41b6d7f0800663fc29. As the CI results on #11076, #10754 is not fixed by the commit, but by 986ab0d2dc161dfa026e8fc7a609f9efb8cb4397. So, let's revert the commit. --- src/libsystemd/sd-device/device-monitor.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/libsystemd/sd-device/device-monitor.c b/src/libsystemd/sd-device/device-monitor.c index fcf9b761ee..623e004fed 100644 --- a/src/libsystemd/sd-device/device-monitor.c +++ b/src/libsystemd/sd-device/device-monitor.c @@ -211,11 +211,9 @@ _public_ int sd_device_monitor_start(sd_device_monitor *m, sd_device_monitor_han return r; } - if (!m->bound) { - r = device_monitor_enable_receiving(m); - if (r < 0) - return r; - } + r = device_monitor_enable_receiving(m); + if (r < 0) + return r; m->callback = callback; m->userdata = userdata; From c821e84ac70186a72a8951289c008025d656000f Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 14 Dec 2018 09:28:29 +0900 Subject: [PATCH 2/3] sd-device: do not modify socket option(s) if socket is passed by PID1 If the socket fd is passed by PID1, then it is created by .socket unit and we have already set sufficient option(s) for the socket. So, let's not touch the passed socket. --- src/libsystemd/sd-device/device-monitor.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/libsystemd/sd-device/device-monitor.c b/src/libsystemd/sd-device/device-monitor.c index 623e004fed..21dfb2bf39 100644 --- a/src/libsystemd/sd-device/device-monitor.c +++ b/src/libsystemd/sd-device/device-monitor.c @@ -275,21 +275,21 @@ int device_monitor_enable_receiving(sd_device_monitor *m) { return log_debug_errno(r, "sd-device-monitor: Failed to update filter: %m"); if (!m->bound) { + /* enable receiving of sender credentials */ + r = setsockopt_int(m->sock, SOL_SOCKET, SO_PASSCRED, true); + if (r < 0) + return log_debug_errno(r, "sd-device-monitor: Failed to set socket option SO_PASSCRED: %m"); + 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: %m"); m->bound = true; + + r = monitor_set_nl_address(m); + if (r < 0) + return log_debug_errno(r, "sd-device-monitor: Failed to set address: %m"); } - r = monitor_set_nl_address(m); - if (r < 0) - return log_debug_errno(r, "sd-device-monitor: Failed to set address: %m"); - - /* enable receiving of sender credentials */ - r = setsockopt_int(m->sock, SOL_SOCKET, SO_PASSCRED, true); - if (r < 0) - return log_debug_errno(r, "sd-device-monitor: Failed to set socket option SO_PASSCRED: %m"); - return 0; } From 903893237a2105b05671fe87b8f5d5e7417040d2 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sat, 8 Dec 2018 18:50:40 +0900 Subject: [PATCH 3/3] sd-device: do not change buffer size if the socket is already bound From the results of CIs in #11076, changing buffer size may cause issue #10754. So, let's prohibit to change the size if it is already bound. This also reverts commit 986ab0d2dc161dfa026e8fc7a609f9efb8cb4397. --- src/libsystemd/sd-device/device-monitor.c | 6 ++++++ src/udev/udevd.c | 3 +-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/libsystemd/sd-device/device-monitor.c b/src/libsystemd/sd-device/device-monitor.c index 21dfb2bf39..b86932663e 100644 --- a/src/libsystemd/sd-device/device-monitor.c +++ b/src/libsystemd/sd-device/device-monitor.c @@ -93,6 +93,12 @@ _public_ int sd_device_monitor_set_receive_buffer_size(sd_device_monitor *m, siz assert_return(m, -EINVAL); assert_return((size_t) n == size, -EINVAL); + if (m->bound) + return log_debug_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), + "sd-device-monitor: Socket fd is already bound. " + "It may be dangerous to change buffer size. " + "Refusing to change buffer size."); + if (setsockopt_int(m->sock, SOL_SOCKET, SO_RCVBUF, n) < 0) { r = setsockopt_int(m->sock, SOL_SOCKET, SO_RCVBUFFORCE, n); if (r < 0) diff --git a/src/udev/udevd.c b/src/udev/udevd.c index fa85f6e263..024fa97ad0 100644 --- a/src/udev/udevd.c +++ b/src/udev/udevd.c @@ -1630,8 +1630,7 @@ 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"); - if (fd_uevent < 0) - (void) sd_device_monitor_set_receive_buffer_size(manager->monitor, 128 * 1024 * 1024); + (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);