Correctly report nscd child process status (BZ #17092)

The nscd parent process returns the result of a `wait' call rather
than the exit status of the child it waits for. These two aren't
exactly the same. In my case (and probably on most machines), the exit
status is in the 2nd LSB of the result of `wait', and so:

e.g. if the nscd child process returns 1, the parent returns 1 << 8,
which Bash happily reports as 0.
This commit is contained in:
Arjun Shankar 2014-06-27 23:31:47 +05:30 committed by Siddhesh Poyarekar
parent cb403c34c6
commit 6f12d0629f
3 changed files with 20 additions and 10 deletions

View file

@ -1,3 +1,9 @@
2014-06-27 Arjun Shankar <arjun.is@lostca.se>
[BZ #17092]
* nscd/nscd.c (monitor_child): Return exit status of child
instead of return value from wait syscall.
2014-06-27 Joseph Myers <joseph@codesourcery.com>
* configure.ac (libc_commonpagesize): Remove variable.

2
NEWS
View file

@ -21,7 +21,7 @@ Version 2.20
16882, 16885, 16888, 16890, 16912, 16915, 16916, 16917, 16918, 16922,
16927, 16928, 16932, 16943, 16958, 16965, 16966, 16967, 16977, 16978,
16984, 16990, 16996, 17009, 17022, 17031, 17042, 17048, 17050, 17058,
17061, 17062, 17069, 17075, 17079, 17084, 17086.
17061, 17062, 17069, 17075, 17079, 17084, 17086, 17092.
* Optimized strchr implementation for AArch64. Contributed by ARM Ltd.

View file

@ -612,21 +612,25 @@ monitor_child (int fd)
method, like a segfault. */
if (ret <= 0 || child_ret != 0)
{
int err = wait (&child_ret);
int status;
int err = wait (&status);
if (err < 0)
{
fprintf (stderr, _("wait failed"));
fprintf (stderr, _("'wait' failed\n"));
return 1;
}
fprintf (stderr, _("child exited with status %d"),
WEXITSTATUS (child_ret));
if (WIFSIGNALED (child_ret))
fprintf (stderr, _(", terminated by signal %d.\n"),
WTERMSIG (child_ret));
else
fprintf (stderr, ".\n");
if (WIFEXITED (status))
{
child_ret = WEXITSTATUS (status);
fprintf (stderr, _("child exited with status %d\n"), child_ret);
}
if (WIFSIGNALED (status))
{
child_ret = WTERMSIG (status);
fprintf (stderr, _("child terminated by signal %d\n"), child_ret);
}
}
/* We have the child status, so exit with that code. */