In current implementation of busybox timeout utility, when a signal
is sent to the process that needs to timeout, it does not affect the
children. To fix this we set the process group id of the process that
the signal is sent, same as it's pid, making it the process group
leader. When sending signal, we sent it to negative pid number as per
man page and signal is received by all children.

Signed-off-by: Alakesh Haloi <alakesh.ha...@gmail.com>
---
 coreutils/timeout.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/coreutils/timeout.c b/coreutils/timeout.c
index 2a628b71d..3a5367718 100644
--- a/coreutils/timeout.c
+++ b/coreutils/timeout.c
@@ -95,6 +95,8 @@ int timeout_main(int argc UNUSED_PARAM, char **argv)
        if (pid == 0) {
                /* Child: spawn grandchild and exit */
                parent = getppid();
+               /* Set parent as process group leader */
+               setpgid(parent, 0);
 #if !BB_MMU
                argv[optind] = xasprintf("-p%u", parent);
                argv[optind + 1] = NULL;
@@ -113,7 +115,9 @@ int timeout_main(int argc UNUSED_PARAM, char **argv)
                                return EXIT_SUCCESS;
                        }
                }
-               kill(parent, signo);
+
+               /* send signal to process group */
+               kill(-parent, signo);
                return EXIT_SUCCESS;
        }
 
-- 
2.17.1

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

Reply via email to