Correctly report nscd child process status.
diff mbox

Message ID 20140625012124.4c63692a@zion
State New
Headers show

Commit Message

Arjun Shankar June 24, 2014, 11:21 p.m. UTC
Hi,

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 patch should fix that.

Cheers,
Arjun

---
 nscd/nscd.c | 20 ++++++++++++--------
 1 file changed, 12 insertions(+), 8 deletions(-)

Comments

Siddhesh Poyarekar June 25, 2014, 7:14 a.m. UTC | #1
On Wed, Jun 25, 2014 at 01:21:24AM +0200, Arjun Shankar wrote:
> 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 patch should fix that.

Thanks for the patch, it looks good, but there are a couple of things
that usually need to be done before a bug fix is pushed in.  It is not
a compulsion if you don't intend to contribute regularly, so if you're
not interested in doing those then say so and I'll do those things for
you:

1. File a bug against nscd in the sourceware bugzilla
2. Refer to the contribution checklist[1] and update your submission
   accordingly.  For example, your submission is missing a ChangeLog
   entry.

Siddhesh

[1] https://sourceware.org/glibc/wiki/Contribution%20checklist

Patch
diff mbox

diff --git a/nscd/nscd.c b/nscd/nscd.c
index 3dd1135..298bdcc 100644
--- a/nscd/nscd.c
+++ b/nscd/nscd.c
@@ -612,7 +612,8 @@  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)
 	{
@@ -620,13 +621,16 @@  monitor_child (int fd)
 	  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.  */