about summary refs log tree commit diff
path: root/nscd/nscd.c
diff options
context:
space:
mode:
authorArjun Shankar <arjun.is@lostca.se>2014-06-27 23:31:47 +0530
committerSiddhesh Poyarekar <siddhesh@redhat.com>2014-06-27 23:31:47 +0530
commit6f12d0629f411c6b580585dbcfb4409a72b7362e (patch)
tree349b3789262cfa097ad6ac3d6d669bcbc19f24d0 /nscd/nscd.c
parentcb403c34c6f6e1cce5018864485958cfc2e28906 (diff)
downloadglibc-6f12d0629f411c6b580585dbcfb4409a72b7362e.tar.gz
glibc-6f12d0629f411c6b580585dbcfb4409a72b7362e.tar.xz
glibc-6f12d0629f411c6b580585dbcfb4409a72b7362e.zip
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.
Diffstat (limited to 'nscd/nscd.c')
-rw-r--r--nscd/nscd.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/nscd/nscd.c b/nscd/nscd.c
index 3dd1135b46..7131ead8cb 100644
--- a/nscd/nscd.c
+++ b/nscd/nscd.c
@@ -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.  */