mirror of
https://git.savannah.gnu.org/git/coreutils.git
synced 2025-09-10 07:59:52 +02:00
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.
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user