]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
udev: refuse too short timeout value
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 19 Dec 2023 03:15:25 +0000 (12:15 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 22 Dec 2023 19:30:32 +0000 (04:30 +0900)
Setting zero or too short timeout for each uevent is meaningless, and
causes the system fails to boot. Let's refuse such values.

Also, delaying execution of RUN= commands too long also makes many
uevents enter the failed state. So, let's refuse such misconfiguration.

src/udev/udev-manager.c
src/udev/udev-manager.h
src/udev/udev-worker.h
src/udev/udevd.c

index 859fc024369e23cad3ee6f3dbc27fdc0c7483c71..d56ddfe538422b31b01329f4c9e3863c914ea4c4 100644 (file)
@@ -1189,13 +1189,33 @@ Manager* manager_new(void) {
                 .worker_watch = EBADF_PAIR,
                 .log_level = LOG_INFO,
                 .resolve_name_timing = RESOLVE_NAME_EARLY,
-                .timeout_usec = 180 * USEC_PER_SEC,
+                .timeout_usec = DEFAULT_WORKER_TIMEOUT_USEC,
                 .timeout_signal = SIGKILL,
         };
 
         return manager;
 }
 
+void manager_adjust_arguments(Manager *manager) {
+        assert(manager);
+
+        if (manager->timeout_usec < MIN_WORKER_TIMEOUT_USEC) {
+                log_debug("Timeout (%s) for processing event is too small, using the default: %s",
+                          FORMAT_TIMESPAN(manager->timeout_usec, 1),
+                          FORMAT_TIMESPAN(DEFAULT_WORKER_TIMEOUT_USEC, 1));
+
+                manager->timeout_usec = DEFAULT_WORKER_TIMEOUT_USEC;
+        }
+
+        if (manager->exec_delay_usec >= manager->timeout_usec) {
+                log_debug("Delay (%s) for executing RUN= commands is too large compared with the timeout (%s) for event execution, ignoring the delay.",
+                          FORMAT_TIMESPAN(manager->exec_delay_usec, 1),
+                          FORMAT_TIMESPAN(manager->timeout_usec, 1));
+
+                manager->exec_delay_usec = 0;
+        }
+}
+
 int manager_init(Manager *manager, int fd_ctrl, int fd_uevent) {
         _cleanup_free_ char *cgroup = NULL;
         int r;
index afbc67f69684a208382e716b14dd49f044d5a0f2..864fc0290e39474e4bfa84b2c873c771fe946d56 100644 (file)
@@ -56,6 +56,7 @@ Manager* manager_new(void);
 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_main(Manager *manager);
 
index 05c319e309710ac7c080ca4f2cc3fc909e1691d0..e9aefc5b04297ab16b0f1a29b0b9f39c7b4b17c8 100644 (file)
@@ -11,6 +11,9 @@
 #include "hashmap.h"
 #include "time-util.h"
 
+#define DEFAULT_WORKER_TIMEOUT_USEC (3 * USEC_PER_MINUTE)
+#define MIN_WORKER_TIMEOUT_USEC     (1 * USEC_PER_MSEC)
+
 typedef struct UdevRules UdevRules;
 
 typedef struct UdevWorker {
index 2ed4282253ec5cf0475036e35859ad3ec2394615..6f8546385e295932187acbf5b0a6a1d31b567968 100644 (file)
@@ -355,6 +355,8 @@ int run_udevd(int argc, char *argv[]) {
                 log_set_max_level(LOG_DEBUG);
         }
 
+        manager_adjust_arguments(manager);
+
         r = must_be_root();
         if (r < 0)
                 return r;