From 11706971e8b6aa289af56454330fffd87f5d5a78 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Wed, 3 Jan 2024 04:23:18 +0900 Subject: [PATCH] udev-spawn: skip executing RUN= if exec_delay= is too long To prevent the worker process killed by the manager. --- src/udev/udev-spawn.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/udev/udev-spawn.c b/src/udev/udev-spawn.c index 4fb5b548a38..8f7c9fec42c 100644 --- a/src/udev/udev-spawn.c +++ b/src/udev/udev-spawn.c @@ -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);