From 3e4a9e13ab88f6656e2f57ac1450832494726713 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Wed, 4 Dec 2024 05:02:53 +0900 Subject: [PATCH] udev: move listen_fds() to udev-manager.c Also - drop redundant error message when manager_init() failed, - close unexpected fds. No functional change, just refactoring. (cherry picked from commit a2840b9599f2c764600c3168017918c2cf213ead) Resolves: RHEL-75774 --- src/udev/udev-manager.c | 57 ++++++++++++++++++++++++++++++++++++++++- src/udev/udev-manager.h | 2 +- src/udev/udevd.c | 45 ++------------------------------ 3 files changed, 59 insertions(+), 45 deletions(-) diff --git a/src/udev/udev-manager.c b/src/udev/udev-manager.c index 5b1135c9e8..6e1935a731 100644 --- a/src/udev/udev-manager.c +++ b/src/udev/udev-manager.c @@ -1228,15 +1228,69 @@ void manager_adjust_arguments(Manager *manager) { } } -int manager_init(Manager *manager, int fd_ctrl, int fd_uevent) { +static int listen_fds(int *ret_ctrl, int *ret_netlink) { + _cleanup_strv_free_ char **names = NULL; + _cleanup_close_ int ctrl_fd = -EBADF, netlink_fd = -EBADF; + + assert(ret_ctrl); + assert(ret_netlink); + + int n = sd_listen_fds_with_names(/* unset_environment = */ true, &names); + if (n < 0) + return n; + + if (strv_length(names) != (size_t) n) + return -EIO; + + for (int i = 0; i < n; i++) { + int fd = SD_LISTEN_FDS_START + i; + + if (sd_is_socket(fd, AF_UNIX, SOCK_SEQPACKET, -1) > 0) { + if (ctrl_fd >= 0) { + log_debug("Received multiple seqpacket socket (%s), ignoring.", names[i]); + goto unused; + } + + ctrl_fd = fd; + continue; + } + + if (sd_is_socket(fd, AF_NETLINK, SOCK_RAW, -1) > 0) { + if (netlink_fd >= 0) { + log_debug("Received multiple netlink socket (%s), ignoring.", names[i]); + goto unused; + } + + netlink_fd = fd; + continue; + } + + log_debug("Received unexpected fd (%s), ignoring.", names[i]); + + unused: + close_and_notify_warn(fd, names[i]); + } + + *ret_ctrl = TAKE_FD(ctrl_fd); + *ret_netlink = TAKE_FD(netlink_fd); + return 0; +} + +int manager_init(Manager *manager) { + _cleanup_close_ int fd_ctrl = -EBADF, fd_uevent = -EBADF; _cleanup_free_ char *cgroup = NULL; int r; assert(manager); + r = listen_fds(&fd_ctrl, &fd_uevent); + if (r < 0) + return log_error_errno(r, "Failed to listen on fds: %m"); + r = udev_ctrl_new_from_fd(&manager->ctrl, fd_ctrl); if (r < 0) return log_error_errno(r, "Failed to initialize udev control socket: %m"); + TAKE_FD(fd_ctrl); r = udev_ctrl_enable_receiving(manager->ctrl); if (r < 0) @@ -1245,6 +1299,7 @@ int manager_init(Manager *manager, int fd_ctrl, int fd_uevent) { r = device_monitor_new_full(&manager->monitor, MONITOR_GROUP_KERNEL, fd_uevent); if (r < 0) return log_error_errno(r, "Failed to initialize device monitor: %m"); + TAKE_FD(fd_uevent); (void) sd_device_monitor_set_description(manager->monitor, "manager"); diff --git a/src/udev/udev-manager.h b/src/udev/udev-manager.h index 5519eb33bb..7c20e29594 100644 --- a/src/udev/udev-manager.h +++ b/src/udev/udev-manager.h @@ -54,7 +54,7 @@ Manager* manager_free(Manager *manager); DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free); void manager_adjust_arguments(Manager *manager); -int manager_init(Manager *manager, int fd_ctrl, int fd_uevent); +int manager_init(Manager *manager); int manager_main(Manager *manager); bool devpath_conflict(const char *a, const char *b); diff --git a/src/udev/udevd.c b/src/udev/udevd.c index bd0cefe8b5..ef1c07a2ca 100644 --- a/src/udev/udevd.c +++ b/src/udev/udevd.c @@ -8,8 +8,6 @@ #include #include -#include "sd-daemon.h" - #include "conf-parser.h" #include "env-file.h" #include "errno-util.h" @@ -32,40 +30,6 @@ static bool arg_debug = false; static int arg_daemonize = false; -static int listen_fds(int *ret_ctrl, int *ret_netlink) { - int ctrl_fd = -EBADF, netlink_fd = -EBADF; - - assert(ret_ctrl); - assert(ret_netlink); - - int n = sd_listen_fds(true); - if (n < 0) - return n; - - for (int fd = SD_LISTEN_FDS_START; fd < n + SD_LISTEN_FDS_START; fd++) { - if (sd_is_socket(fd, AF_UNIX, SOCK_SEQPACKET, -1) > 0) { - if (ctrl_fd >= 0) - return -EINVAL; - ctrl_fd = fd; - continue; - } - - if (sd_is_socket(fd, AF_NETLINK, SOCK_RAW, -1) > 0) { - if (netlink_fd >= 0) - return -EINVAL; - netlink_fd = fd; - continue; - } - - return -EINVAL; - } - - *ret_ctrl = ctrl_fd; - *ret_netlink = netlink_fd; - - return 0; -} - static DEFINE_CONFIG_PARSE_ENUM(config_parse_resolve_name_timing, resolve_name_timing, ResolveNameTiming); static int manager_parse_udev_config(Manager *manager) { @@ -287,7 +251,6 @@ static int parse_argv(int argc, char *argv[], Manager *manager) { int run_udevd(int argc, char *argv[]) { _cleanup_(manager_freep) Manager *manager = NULL; - int fd_ctrl = -EBADF, fd_uevent = -EBADF; int r; log_setup(); @@ -331,13 +294,9 @@ int run_udevd(int argc, char *argv[]) { if (r < 0 && r != -EEXIST) return log_error_errno(r, "Failed to create /run/udev: %m"); - r = listen_fds(&fd_ctrl, &fd_uevent); - if (r < 0) - return log_error_errno(r, "Failed to listen on fds: %m"); - - r = manager_init(manager, fd_ctrl, fd_uevent); + r = manager_init(manager); if (r < 0) - return log_error_errno(r, "Failed to create manager: %m"); + return r; if (arg_daemonize) { pid_t pid;