]> sourceware.org Git - glibc.git/commitdiff
Correctly report nscd child process status (BZ #17092)
authorArjun Shankar <arjun.is@lostca.se>
Fri, 27 Jun 2014 18:01:47 +0000 (23:31 +0530)
committerSiddhesh Poyarekar <siddhesh@redhat.com>
Fri, 27 Jun 2014 18:01:47 +0000 (23:31 +0530)
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.

ChangeLog
NEWS
nscd/nscd.c

index 510e78ac0f837e0a1ca40570244d670f76037f63..79ac38715d45ebc008fa3b1d348c21d55d14fe55 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
diff --git a/NEWS b/NEWS
index 7663f01c1a93259c6a3ffe025146702e28748165..02e3cd83ff8c4d5ca7594438a065f06aeaf81e09 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -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.
 
index 3dd1135b466260ec0d4ed586726df1bbd355ef6b..7131ead8cbd65c7f3aaf5f75f3336bf803623804 100644 (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.  */
This page took 0.12294 seconds and 5 git commands to generate.