From: Yu Watanabe Date: Mon, 27 May 2024 01:43:54 +0000 (+0900) Subject: sd-device-monitor: bind socket in device_monitor_new_full() X-Git-Tag: v257-rc1~772^2~9 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f49faf056211509aa726c0e5983c42171f410410;p=thirdparty%2Fsystemd.git sd-device-monitor: bind socket in device_monitor_new_full() Previously, device_monitor_enable_receiving() does - update filter, - bind socket. But, binding socket can be done in when the socket is opened. Let's remove device_monitor_enable_receiving() and bind the socket in device_monitor_new_full(). --- diff --git a/src/libsystemd/sd-device/device-monitor-private.h b/src/libsystemd/sd-device/device-monitor-private.h index 33e27146052..96513649ff8 100644 --- a/src/libsystemd/sd-device/device-monitor-private.h +++ b/src/libsystemd/sd-device/device-monitor-private.h @@ -16,7 +16,6 @@ typedef enum MonitorNetlinkGroup { int device_monitor_new_full(sd_device_monitor **ret, MonitorNetlinkGroup group, int fd); int device_monitor_disconnect(sd_device_monitor *m); int device_monitor_allow_unicast_sender(sd_device_monitor *m, sd_device_monitor *sender); -int device_monitor_enable_receiving(sd_device_monitor *m); int device_monitor_get_fd(sd_device_monitor *m); int device_monitor_send_device(sd_device_monitor *m, sd_device_monitor *destination, sd_device *device); int device_monitor_receive_device(sd_device_monitor *m, sd_device **ret); diff --git a/src/libsystemd/sd-device/device-monitor.c b/src/libsystemd/sd-device/device-monitor.c index 5845932188e..69d6864f005 100644 --- a/src/libsystemd/sd-device/device-monitor.c +++ b/src/libsystemd/sd-device/device-monitor.c @@ -45,7 +45,6 @@ struct sd_device_monitor { int sock; union sockaddr_union snl; union sockaddr_union snl_trusted_sender; - bool bound; UIDRange *mapped_userns_uid_range; @@ -170,17 +169,24 @@ int device_monitor_new_full(sd_device_monitor **ret, MonitorNetlinkGroup group, *m = (sd_device_monitor) { .n_ref = 1, .sock = fd >= 0 ? fd : TAKE_FD(sock), - .bound = fd >= 0, .snl.nl.nl_family = AF_NETLINK, .snl.nl.nl_groups = group, }; - if (fd >= 0) { - r = monitor_set_nl_address(m); - if (r < 0) { - log_monitor_errno(m, r, "Failed to set netlink address: %m"); - goto fail; - } + if (fd < 0) { + /* enable receiving of sender credentials */ + r = setsockopt_int(m->sock, SOL_SOCKET, SO_PASSCRED, true); + if (r < 0) + return log_monitor_errno(m, r, "Failed to set socket option SO_PASSCRED: %m"); + + if (bind(m->sock, &m->snl.sa, sizeof(struct sockaddr_nl)) < 0) + return log_monitor_errno(m, errno, "Failed to bind monitoring socket: %m"); + } + + r = monitor_set_nl_address(m); + if (r < 0) { + log_monitor_errno(m, r, "Failed to set netlink address: %m"); + goto fail; } if (DEBUG_LOGGING) { @@ -277,9 +283,9 @@ _public_ int sd_device_monitor_start(sd_device_monitor *m, sd_device_monitor_han return r; } - r = device_monitor_enable_receiving(m); + r = sd_device_monitor_filter_update(m); if (r < 0) - return r; + return log_monitor_errno(m, r, "Failed to update filter: %m"); m->callback = callback; m->userdata = userdata; @@ -354,34 +360,6 @@ _public_ int sd_device_monitor_get_description(sd_device_monitor *m, const char return 0; } -int device_monitor_enable_receiving(sd_device_monitor *m) { - int r; - - assert(m); - - r = sd_device_monitor_filter_update(m); - if (r < 0) - return log_monitor_errno(m, r, "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_monitor_errno(m, r, "Failed to set socket option SO_PASSCRED: %m"); - - if (bind(m->sock, &m->snl.sa, sizeof(struct sockaddr_nl)) < 0) - return log_monitor_errno(m, errno, "Failed to bind monitoring socket: %m"); - - m->bound = true; - - r = monitor_set_nl_address(m); - if (r < 0) - return log_monitor_errno(m, r, "Failed to set address: %m"); - } - - return 0; -} - static sd_device_monitor *device_monitor_free(sd_device_monitor *m) { assert(m); diff --git a/src/libudev/libudev-monitor.c b/src/libudev/libudev-monitor.c index d7c931d9f92..b283154c400 100644 --- a/src/libudev/libudev-monitor.c +++ b/src/libudev/libudev-monitor.c @@ -109,14 +109,12 @@ _public_ int udev_monitor_filter_update(struct udev_monitor *udev_monitor) { * udev_monitor_enable_receiving: * @udev_monitor: the monitor which should receive events * - * Binds the @udev_monitor socket to the event source. + * Deprecated, and alias of udev_monitor_filter_update(). * * Returns: 0 on success, otherwise a negative error value. */ _public_ int udev_monitor_enable_receiving(struct udev_monitor *udev_monitor) { - assert_return(udev_monitor, -EINVAL); - - return device_monitor_enable_receiving(udev_monitor->monitor); + return udev_monitor_filter_update(udev_monitor); } /** diff --git a/src/udev/udev-manager.c b/src/udev/udev-manager.c index bb944787754..e44b7eb0ceb 100644 --- a/src/udev/udev-manager.c +++ b/src/udev/udev-manager.c @@ -398,10 +398,6 @@ static int worker_spawn(Manager *manager, Event *event) { if (r < 0) return log_error_errno(r, "Worker: Failed to set unicast sender: %m"); - r = device_monitor_enable_receiving(worker_monitor); - if (r < 0) - return log_error_errno(r, "Worker: Failed to enable receiving of device: %m"); - r = safe_fork("(udev-worker)", FORK_DEATHSIG_SIGTERM, &pid); if (r < 0) { event->state = EVENT_QUEUED; @@ -1262,10 +1258,6 @@ int manager_init(Manager *manager, int fd_ctrl, int fd_uevent) { (void) sd_device_monitor_set_description(manager->monitor, "manager"); - r = device_monitor_enable_receiving(manager->monitor); - if (r < 0) - return log_error_errno(r, "Failed to bind netlink socket: %m"); - manager->log_level = log_get_max_level(); r = cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, 0, &cgroup);