This is the mail archive of the glibc-cvs@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

GNU C Library master sources branch master updated. glibc-2.17-441-ga600e5c


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".

The branch, master has been updated
       via  a600e5cef53e10147932d910cdb2fdfc62afae4e (commit)
      from  6b18bea6256e1eefebd27811873831d0e3f171de (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://sources.redhat.com/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=a600e5cef53e10147932d910cdb2fdfc62afae4e

commit a600e5cef53e10147932d910cdb2fdfc62afae4e
Author: Roland McGrath <roland@hack.frob.com>
Date:   Tue Mar 19 17:07:15 2013 -0700

    Consolidate Linux and POSIX libc_fatal code.

diff --git a/ChangeLog b/ChangeLog
index d719501..7d957d5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+2013-03-19  Roland McGrath  <roland@hack.frob.com>
+
+	* sysdeps/posix/libc_fatal.c: Include <sys/mman.h>.
+	[!WRITEV_FOR_FATAL] (writev_for_fatal): New function.
+	[!WRITEV_FOR_FATAL] (WRITEV_FOR_FATAL): New macro; call that.
+	[!BEFORE_ABORT] (before_abort): New function.
+	[!BEFORE_ABORT] (BEFORE_ABORT): New macro; call that.
+	* sysdeps/unix/sysv/linux/libc_fatal.c: Trim includes.
+	(writev_for_fatal): New function.
+	(WRITEV_FOR_FATAL): New macro; call that.
+	(backtrace_and_maps): New function.
+	(BEFORE_ABORT): New macro; call that.
+	(struct str_list): Type removed.
+	(__libc_message, __libc_fatal): Functions removed.
+	Include <sysdeps/posix/libc_fatal.c> instead.
+
 2013-03-19  Joseph Myers  <joseph@codesourcery.com>
 
 	* math/k_casinhf.c (__kernel_casinhf): Consistently use float
diff --git a/sysdeps/posix/libc_fatal.c b/sysdeps/posix/libc_fatal.c
index 8d41600..afa1b81 100644
--- a/sysdeps/posix/libc_fatal.c
+++ b/sysdeps/posix/libc_fatal.c
@@ -1,4 +1,5 @@
-/* Copyright (C) 1993-2013 Free Software Foundation, Inc.
+/* Catastrophic failure reports.  Generic POSIX.1 version.
+   Copyright (C) 1993-2013 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -27,6 +28,7 @@
 #include <string.h>
 #include <sysdep.h>
 #include <unistd.h>
+#include <sys/mman.h>
 #include <sys/syslog.h>
 #include <sys/uio.h>
 #include <not-cancel.h>
@@ -35,6 +37,25 @@
 #include FATAL_PREPARE_INCLUDE
 #endif
 
+#ifndef WRITEV_FOR_FATAL
+# define WRITEV_FOR_FATAL	writev_for_fatal
+static bool
+writev_for_fatal (int fd, const struct iovec *iov, size_t niov, size_t total)
+{
+  return TEMP_FAILURE_RETRY (__writev (fd, iov, niov)) == total;
+}
+#endif
+
+#ifndef BEFORE_ABORT
+# define BEFORE_ABORT		before_abort
+static void
+before_abort (int do_abort __attribute__ ((unused)),
+              bool written __attribute__ ((unused)),
+              int fd __attribute__ ((unused)))
+{
+}
+#endif
+
 struct str_list
 {
   const char *str;
@@ -42,7 +63,6 @@ struct str_list
   struct str_list *next;
 };
 
-
 /* Abort with an error message.  */
 void
 __libc_message (int do_abort, const char *fmt, ...)
@@ -121,8 +141,7 @@ __libc_message (int do_abort, const char *fmt, ...)
 	  list = list->next;
 	}
 
-      if (TEMP_FAILURE_RETRY (__writev (fd, iov, nlist)) == total)
-	written = true;
+      written = WRITEV_FOR_FATAL (fd, iov, nlist, total);
 
       if (do_abort)
 	{
@@ -131,7 +150,7 @@ __libc_message (int do_abort, const char *fmt, ...)
 	  struct abort_msg_s *buf = __mmap (NULL, total,
 					    PROT_READ | PROT_WRITE,
 					    MAP_ANON | MAP_PRIVATE, -1, 0);
-	  if (buf != MAP_FAILED)
+	  if (__glibc_likely (buf != MAP_FAILED))
 	    {
 	      buf->size = total;
 	      char *wp = buf->msg;
@@ -158,8 +177,12 @@ __libc_message (int do_abort, const char *fmt, ...)
   va_end (ap_copy);
 
   if (do_abort)
-    /* Kill the application.  */
-    abort ();
+    {
+      BEFORE_ABORT (do_abort, written, fd);
+
+      /* Kill the application.  */
+      abort ();
+    }
 }
 
 
diff --git a/sysdeps/unix/sysv/linux/libc_fatal.c b/sysdeps/unix/sysv/linux/libc_fatal.c
index bac4b87..84429cd 100644
--- a/sysdeps/unix/sysv/linux/libc_fatal.c
+++ b/sysdeps/unix/sysv/linux/libc_fatal.c
@@ -1,4 +1,5 @@
-/* Copyright (C) 1993-2013 Free Software Foundation, Inc.
+/* Catastrophic failure reports.  Linux version.
+   Copyright (C) 1993-2013 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -15,195 +16,52 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <atomic.h>
 #include <errno.h>
-#include <fcntl.h>
-#include <ldsodefs.h>
-#include <paths.h>
-#include <stdarg.h>
-#include <stdbool.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sysdep.h>
-#include <unistd.h>
-#include <sys/mman.h>
-#include <sys/syslog.h>
 #include <execinfo.h>
-
-/* Abort with an error message.  */
+#include <fcntl.h>
 #include <not-cancel.h>
+#include <sys/mman.h>
+#include <sys/uio.h>
 
-#ifdef FATAL_PREPARE_INCLUDE
-#include FATAL_PREPARE_INCLUDE
-#endif
-
-struct str_list
+static bool
+writev_for_fatal (int fd, const struct iovec *iov, size_t niov, size_t total)
 {
-  const char *str;
-  size_t len;
-  struct str_list *next;
-};
-
+  INTERNAL_SYSCALL_DECL (err);
+  ssize_t cnt;
+  do
+    cnt = INTERNAL_SYSCALL (writev, err, 3, fd, iov, niov);
+  while (INTERNAL_SYSCALL_ERROR_P (cnt, err)
+         && INTERNAL_SYSCALL_ERRNO (cnt, err) == EINTR);
+  return cnt == total;
+}
+#define WRITEV_FOR_FATAL	writev_for_fatal
 
-/* Abort with an error message.  */
-void
-__libc_message (int do_abort, const char *fmt, ...)
+static void
+backtrace_and_maps (int do_abort, bool written, int fd)
 {
-  va_list ap;
-  va_list ap_copy;
-  int fd = -1;
-
-  va_start (ap, fmt);
-  va_copy (ap_copy, ap);
-
-#ifdef FATAL_PREPARE
-  FATAL_PREPARE;
-#endif
-
-  /* Open a descriptor for /dev/tty unless the user explicitly
-     requests errors on standard error.  */
-  const char *on_2 = __libc_secure_getenv ("LIBC_FATAL_STDERR_");
-  if (on_2 == NULL || *on_2 == '\0')
-    fd = open_not_cancel_2 (_PATH_TTY, O_RDWR | O_NOCTTY | O_NDELAY);
-
-  if (fd == -1)
-    fd = STDERR_FILENO;
-
-  struct str_list *list = NULL;
-  int nlist = 0;
-
-  const char *cp = fmt;
-  while (*cp != '\0')
-    {
-      /* Find the next "%s" or the end of the string.  */
-      const char *next = cp;
-      while (next[0] != '%' || next[1] != 's')
-	{
-	  next = __strchrnul (next + 1, '%');
-
-	  if (next[0] == '\0')
-	    break;
-	}
-
-      /* Determine what to print.  */
-      const char *str;
-      size_t len;
-      if (cp[0] == '%' && cp[1] == 's')
-	{
-	  str = va_arg (ap, const char *);
-	  len = strlen (str);
-	  cp += 2;
-	}
-      else
-	{
-	  str = cp;
-	  len = next - cp;
-	  cp = next;
-	}
-
-      struct str_list *newp = alloca (sizeof (struct str_list));
-      newp->str = str;
-      newp->len = len;
-      newp->next = list;
-      list = newp;
-      ++nlist;
-    }
-
-  bool written = false;
-  if (nlist > 0)
-    {
-      struct iovec *iov = alloca (nlist * sizeof (struct iovec));
-      ssize_t total = 0;
-
-      for (int cnt = nlist - 1; cnt >= 0; --cnt)
-	{
-	  iov[cnt].iov_base = (void *) list->str;
-	  iov[cnt].iov_len = list->len;
-	  total += list->len;
-	  list = list->next;
-	}
-
-      INTERNAL_SYSCALL_DECL (err);
-      ssize_t cnt;
-      do
-	cnt = INTERNAL_SYSCALL (writev, err, 3, fd, iov, nlist);
-      while (INTERNAL_SYSCALL_ERROR_P (cnt, err)
-	     && INTERNAL_SYSCALL_ERRNO (cnt, err) == EINTR);
-
-      if (cnt == total)
-	written = true;
-
-      if (do_abort)
-	{
-	  total = ((total + 1 + GLRO(dl_pagesize) - 1)
-		   & ~(GLRO(dl_pagesize) - 1));
-	  struct abort_msg_s *buf = __mmap (NULL, total,
-					    PROT_READ | PROT_WRITE,
-					    MAP_ANON | MAP_PRIVATE, -1, 0);
-	  if (__builtin_expect (buf != MAP_FAILED, 1))
-	    {
-	      buf->size = total;
-	      char *wp = buf->msg;
-	      for (int cnt = 0; cnt < nlist; ++cnt)
-		wp = mempcpy (wp, iov[cnt].iov_base, iov[cnt].iov_len);
-	      *wp = '\0';
-
-	      /* We have to free the old buffer since the application might
-		 catch the SIGABRT signal.  */
-	      struct abort_msg_s *old = atomic_exchange_acq (&__abort_msg,
-							     buf);
-	      if (old != NULL)
-		__munmap (old, old->size);
-	    }
-	}
-    }
-
-  va_end (ap);
-
-  /* If we  had no success writing the message, use syslog.  */
-  if (! written)
-    vsyslog (LOG_ERR, fmt, ap_copy);
-
-  va_end (ap_copy);
-
-  if (do_abort)
+  if (do_abort > 1 && written)
     {
-      if (do_abort > 1 && written)
-	{
-	  void *addrs[64];
+      void *addrs[64];
 #define naddrs (sizeof (addrs) / sizeof (addrs[0]))
-	  int n = __backtrace (addrs, naddrs);
-	  if (n > 2)
-	    {
+      int n = __backtrace (addrs, naddrs);
+      if (n > 2)
+        {
 #define strnsize(str) str, strlen (str)
 #define writestr(str) write_not_cancel (fd, str)
-	      writestr (strnsize ("======= Backtrace: =========\n"));
-	      __backtrace_symbols_fd (addrs + 1, n - 1, fd);
-
-	      writestr (strnsize ("======= Memory map: ========\n"));
-	      int fd2 = open_not_cancel_2 ("/proc/self/maps", O_RDONLY);
-	      char buf[1024];
-	      ssize_t n2;
-	      while ((n2 = read_not_cancel (fd2, buf, sizeof (buf))) > 0)
-		if (write_not_cancel (fd, buf, n2) != n2)
-		  break;
-	      close_not_cancel_no_status (fd2);
-	    }
-	}
-
-      /* Terminate the process.  */
-      abort ();
+          writestr (strnsize ("======= Backtrace: =========\n"));
+          __backtrace_symbols_fd (addrs + 1, n - 1, fd);
+
+          writestr (strnsize ("======= Memory map: ========\n"));
+          int fd2 = open_not_cancel_2 ("/proc/self/maps", O_RDONLY);
+          char buf[1024];
+          ssize_t n2;
+          while ((n2 = read_not_cancel (fd2, buf, sizeof (buf))) > 0)
+            if (write_not_cancel (fd, buf, n2) != n2)
+              break;
+          close_not_cancel_no_status (fd2);
+        }
     }
 }
+#define BEFORE_ABORT		backtrace_and_maps
 
-
-void
-__libc_fatal (message)
-     const char *message;
-{
-  /* The loop is added only to keep gcc happy.  */
-  while (1)
-    __libc_message (1, "%s", message);
-}
-libc_hidden_def (__libc_fatal)
+#include <sysdeps/posix/libc_fatal.c>

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog                            |   16 +++
 sysdeps/posix/libc_fatal.c           |   37 +++++-
 sysdeps/unix/sysv/linux/libc_fatal.c |  216 ++++++----------------------------
 3 files changed, 83 insertions(+), 186 deletions(-)


hooks/post-receive
-- 
GNU C Library master sources


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]