udev-spawn: skip executing RUN= if exec_delay= is too long
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 2 Jan 2024 19:23:18 +0000 (04:23 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 2 Jan 2024 19:23:18 +0000 (04:23 +0900)
To prevent the worker process killed by the manager.

src/udev/udev-spawn.c

index 4fb5b548a38a4bd7adb16e38f8d2a4f0dab8b94a..8f7c9fec42c9eed1c0388e20c6510d47d6b3d0fc 100644 (file)
@@ -338,6 +338,17 @@ void udev_event_execute_run(UdevEvent *event) {
                                 log_device_debug_errno(event->dev, r, "Failed to run built-in command \"%s\", ignoring: %m", command);
                 } else {
                         if (event->worker && event->worker->exec_delay_usec > 0) {
+                                usec_t timeout_usec = event->worker ? event->worker->timeout_usec : DEFAULT_WORKER_TIMEOUT_USEC;
+                                usec_t now_usec = now(CLOCK_MONOTONIC);
+                                usec_t age_usec = usec_sub_unsigned(now_usec, event->birth_usec);
+
+                                if (event->worker->exec_delay_usec >= usec_sub_unsigned(timeout_usec, age_usec)) {
+                                        log_device_warning(event->dev,
+                                                           "Cannot delaying execution of \"%s\" for %s, skipping.",
+                                                           command, FORMAT_TIMESPAN(event->worker->exec_delay_usec, USEC_PER_SEC));
+                                        continue;
+                                }
+
                                 log_device_debug(event->dev, "Delaying execution of \"%s\" for %s.",
                                                  command, FORMAT_TIMESPAN(event->worker->exec_delay_usec, USEC_PER_SEC));
                                 (void) usleep_safe(event->worker->exec_delay_usec);