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 <r...@pobox.com>
---
 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;
-- 
2.44.0

_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to