From: Pádraig Brady
Date: Mon, 31 Aug 2009 18:18:27 +0000 (+0100) Subject: timeout: defensive handling of all wait() errors X-Git-Tag: v7.6~50 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0b1dcf33;p=thirdparty%2Fcoreutils.git 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. --- diff --git a/src/timeout.c b/src/timeout.c index 20efdddc0a..62f3d4b6e2 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;