From 0b1dcf33f5b9d0102b852a361135462708408a71 Mon Sep 17 00:00:00 2001 From: Pádraig Brady Date: Mon, 31 Aug 2009 19:18:27 +0100 Subject: timeout: defensive handling of all wait() errors * src/timeout.c (main): Handle all possible cases of unexpected failures from wait(). This was prompted by the clang tool reporting the possible non-initialization of the status variable. --- src/timeout.c | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) (limited to 'src/timeout.c') diff --git a/src/timeout.c b/src/timeout.c index 20efdddc0..62f3d4b6e 100644 --- a/src/timeout.c +++ b/src/timeout.c @@ -317,12 +317,25 @@ main (int argc, char **argv) child exits, not on this process receiving a signal. Also we're not passing WUNTRACED | WCONTINUED to a waitpid() call and so will not get indication that the child has stopped or continued. */ - wait (&status); - - if (WIFEXITED (status)) - status = WEXITSTATUS (status); - else if (WIFSIGNALED (status)) - status = WTERMSIG (status) + 128; /* what sh does at least. */ + if (wait (&status) == -1) + { + /* shouldn't happen. */ + error (0, errno, _("error waiting for command")); + status = EXIT_CANCELED; + } + else + { + if (WIFEXITED (status)) + status = WEXITSTATUS (status); + else if (WIFSIGNALED (status)) + status = WTERMSIG (status) + 128; /* what sh does at least. */ + else + { + /* shouldn't happen. */ + error (0, 0, _("unknown status from command (0x%X)"), status); + status = EXIT_FAILURE; + } + } if (timed_out) return EXIT_TIMEDOUT; -- cgit v1.2.3-54-g00ecf