]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
script: be sensitive to another SIGCHLD ssi_codes
authorKarel Zak <kzak@redhat.com>
Wed, 5 Sep 2018 09:51:22 +0000 (11:51 +0200)
committerKarel Zak <kzak@redhat.com>
Wed, 5 Sep 2018 09:55:21 +0000 (11:55 +0200)
The current signalfd handler cares on CLD_EXITED only. It's pretty
insufficient as there is more situations (and codes) when child no
more running.

Addresses: https://github.com/karelzak/util-linux/issues/686
Signed-off-by: Karel Zak <kzak@redhat.com>
term-utils/script.c

index 6d5ddd84a2ec21ba282a0375a5c8a785fb7609fa..7692f91e2b33acae4c3ba97e4bc6bc8cd09d8b41 100644 (file)
@@ -477,10 +477,15 @@ static void handle_signal(struct script_control *ctl, int fd)
 
        switch (info.ssi_signo) {
        case SIGCHLD:
-               DBG(SIGNAL, ul_debug(" get signal SIGCHLD"));
-               if (info.ssi_code == CLD_EXITED) {
+               DBG(SIGNAL, ul_debug(" get signal SIGCHLD [ssi_code=%d, ssi_status=%d]",
+                                                       info.ssi_code, info.ssi_status));
+               if (info.ssi_code == CLD_EXITED
+                   || info.ssi_code == CLD_KILLED
+                   || info.ssi_code == CLD_DUMPED) {
                        wait_for_child(ctl, 0);
                        ctl->poll_timeout = 10;
+
+               /* In case of ssi_code is CLD_TRAPPED, CLD_STOPPED, or CLD_CONTINUED */
                } else if (info.ssi_status == SIGSTOP && ctl->child) {
                        DBG(SIGNAL, ul_debug(" child stop by SIGSTOP -- stop parent too"));
                        kill(getpid(), SIGSTOP);
@@ -508,6 +513,7 @@ static void handle_signal(struct script_control *ctl, int fd)
        default:
                abort();
        }
+       DBG(SIGNAL, ul_debug("signal handle on FD %d done", fd));
 }
 
 static void do_io(struct script_control *ctl)