From e4b5ccd13bb59eaaec6aa7f22655cc469f8900a2 Mon Sep 17 00:00:00 2001 From: Ron Yorston Date: Mon, 8 Apr 2024 13:12:25 +0100 Subject: timeout: allow fractional seconds in timeout values The 'timeout' applet uses parse_duration_str() to obtain its timeout values. The default configuration enables float durations. However, the applet silently ignores fractional seconds. This results in unexpected behaviour: $ timeout 5.99 sleep 5.1; echo $? Terminated 143 When float durations are enabled ensure that any fractional seconds are taken into account. function old new delta timeout_wait 44 92 +48 timeout_main 383 365 -18 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 1/1 up/down: 48/-18) Total: 30 bytes Signed-off-by: Ron Yorston Signed-off-by: Denys Vlasenko --- coreutils/timeout.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/coreutils/timeout.c b/coreutils/timeout.c index 18aa9ebeb..84299a0a5 100644 --- a/coreutils/timeout.c +++ b/coreutils/timeout.c @@ -47,11 +47,16 @@ #include "libbb.h" -static NOINLINE int timeout_wait(int timeout, pid_t pid) +static NOINLINE int timeout_wait(duration_t timeout, pid_t pid) { /* Just sleep(HUGE_NUM); kill(parent) may kill wrong process! */ while (1) { - sleep1(); +#if ENABLE_FLOAT_DURATION + if (timeout < 1) + sleep_for_duration(timeout); + else +#endif + sleep1(); if (--timeout <= 0) break; if (kill(pid, 0)) { @@ -68,8 +73,8 @@ int timeout_main(int argc UNUSED_PARAM, char **argv) int signo; int status; int parent = 0; - int timeout; - int kill_timeout; + duration_t timeout; + duration_t kill_timeout; pid_t pid; #if !BB_MMU char *sv1, *sv2; -- cgit v1.2.3-55-g6feb