diff --git a/src/libsystemd/sd-device/device-monitor.c b/src/libsystemd/sd-device/device-monitor.c index fcf9b761ee..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) @@ -211,11 +217,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; @@ -277,21 +281,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; } 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);