diff --git a/runner/executor.c b/runner/executor.c index 62303ff8..52fee7d1 100644 --- a/runner/executor.c +++ b/runner/executor.c @@ -1247,18 +1247,25 @@ static bool should_die_because_signal(int sigfd) { struct signalfd_siginfo siginfo; int ret; - struct pollfd sigpoll = { .fd = sigfd, .events = POLLIN | POLLRDBAND }; - if ((ret = poll(&sigpoll, 1, 0)) != 0) { + ret = poll(&sigpoll, 1, 0); + + if (ret != 0) { if (ret == -1) { + fprintf(stderr, "Poll on signalfd failed with %s\n", strerror(errno)); + return true; /* something is wrong, let's die */ } ret = read(sigfd, &siginfo, sizeof(siginfo)); + if (ret == -1) { + fprintf(stderr, "Error reading from signalfd: %s\n", strerror(errno)); + return false; /* we may want to retry later */ + } + if (siginfo.ssi_signo == SIGCHLD) { fprintf(stderr, "Runner got stray SIGCHLD while not executing any tests.\n"); - } else { fprintf(stderr, "Runner is being killed by %s\n", strsignal(siginfo.ssi_signo)); @@ -1333,7 +1340,7 @@ bool execute(struct execute_state *state, if (sigfd < 0) { /* TODO: Handle better */ fprintf(stderr, "Cannot mask signals\n"); - status = -1; + status = false; goto end; } @@ -1419,7 +1426,7 @@ bool execute(struct execute_state *state, close_watchdogs(settings); sigprocmask(SIG_UNBLOCK, &sigmask, NULL); /* make sure that we do not leave any signals unhandled */ - if (should_die_because_signal(sigfd)){ + if (should_die_because_signal(sigfd)) { status = false; goto end_post_signal_restore; }