]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Update.
authorUlrich Drepper <drepper@redhat.com>
Sat, 13 Nov 2004 03:13:00 +0000 (03:13 +0000)
committerUlrich Drepper <drepper@redhat.com>
Sat, 13 Nov 2004 03:13:00 +0000 (03:13 +0000)
2004-11-12  Ulrich Drepper  <drepper@redhat.com>

* sysdeps/unix/sysv/linux/libc_fatal.c: Add new function __libc_message
which performs the printing and simple format string handling.  The
string is written to tty, stderr, syslog in this order, stopping after
the first successful output.
(__libc_fatal): Call __libc_message.
* include/stdio.h: Declare __libc_message.
* malloc/malloc.c (malloc_printerr): Use __libc_message.
* debug/chk_fail.c: Also print message with __libc_message.
* debug/test-strcpy_chk.c: Ensure that debug messages are not printed
to the terminal or stderr.
* debug/tst-chk1.c: Likewise.

* posix/Makefile: Remove gpl2lgpl variable.

ChangeLog
debug/chk_fail.c
debug/test-strcpy_chk.c
debug/tst-chk1.c
include/stdio.h
malloc/malloc.c

index b62c2e1130b60f8daf96f13b08c58ebcbb987a0b..1888ce03c08e3f60248fd03d5d42749ab9b261ba 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+2004-11-12  Ulrich Drepper  <drepper@redhat.com>
+
+       * sysdeps/unix/sysv/linux/libc_fatal.c: Add new function __libc_message
+       which performs the printing and simple format string handling.  The
+       string is written to tty, stderr, syslog in this order, stopping after
+       the first successful output.
+       (__libc_fatal): Call __libc_message.
+       * include/stdio.h: Declare __libc_message.
+       * malloc/malloc.c (malloc_printerr): Use __libc_message.
+       * debug/chk_fail.c: Also print message with __libc_message.
+       * debug/test-strcpy_chk.c: Ensure that debug messages are not printed
+       to the terminal or stderr.
+       * debug/tst-chk1.c: Likewise.
+
+       * posix/Makefile: Remove gpl2lgpl variable.
+
 2004-11-12  Martin Schwidefsky  <schwidefsky@de.ibm.com>
 
        * elf/elf.h: Add 20 bit relocations R_390_*20.
index 48848fbe35464c120fe800655bac28047889c3d2..dc1c3d70b6cf2c1921dd6393fb9f83995995f2a9 100644 (file)
@@ -1,3 +1,4 @@
+
 /* Copyright (C) 2004 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
+#include <stdio.h>
 #include <stdlib.h>
-#include <unistd.h>
-#include <abort-instr.h>
 
 
 void
 __attribute__ ((noreturn))
 __chk_fail (void)
 {
-  while (1)
-    {
-      /* This will leave a nice backtrace.  */
-      abort ();
-#ifdef ABORT_INSTRUCTION
-      ABORT_INSTRUCTION;
-#endif
-      _exit (127);
-    }
+  __libc_fatal ("*** buffer overflow detected ***\n");
 }
 libc_hidden_def (__chk_fail)
index 4c61f4fb432c6d591f35aad50bc20848258cc1f5..ac9f9448cf66997577c08d43fa8dd46950680bdf 100644 (file)
@@ -46,6 +46,8 @@ simple_strcpy_chk (char *dst, const char *src, size_t len)
 }
 #endif
 
+#include <fcntl.h>
+#include <paths.h>
 #include <setjmp.h>
 #include <signal.h>
 
@@ -80,8 +82,8 @@ do_one_test (impl_t *impl, char *dst, const char *src,
       if (setjmp (chk_fail_buf) == 0)
        {
          res = CALL (impl, dst, src, dlen);
-         error (0, 0, "Function %s (%zd; %zd) did not __chk_fail",
-                impl->name, len, dlen);
+         printf ("*** Function %s (%zd; %zd) did not __chk_fail\n",
+                 impl->name, len, dlen);
          chk_fail_ok = 0;
          ret = 1;
        }
@@ -92,16 +94,16 @@ do_one_test (impl_t *impl, char *dst, const char *src,
 
   if (res != STRCPY_RESULT (dst, len))
     {
-      error (0, 0, "Wrong result in function %s %p %p", impl->name,
-            res, STRCPY_RESULT (dst, len));
+      printf ("Wrong result in function %s %p %p\n", impl->name,
+             res, STRCPY_RESULT (dst, len));
       ret = 1;
       return;
     }
 
   if (strcmp (dst, src) != 0)
     {
-      error (0, 0, "Wrong result in function %s dst \"%s\" src \"%s\"",
-            impl->name, dst, src);
+      printf ("Wrong result in function %s dst \"%s\" src \"%s\"\n",
+             impl->name, dst, src);
       ret = 1;
       return;
     }
@@ -232,7 +234,7 @@ do_random_tests (void)
                  if (setjmp (chk_fail_buf) == 0)
                    {
                      res = CALL (impl, p2 + align2, p1 + align1, dlen);
-                     error (0, 0, "Iteration %zd - did not __chk_fail", n);
+                     printf ("Iteration %zd - did not __chk_fail\n", n);
                      chk_fail_ok = 0;
                      ret = 1;
                    }
@@ -243,17 +245,19 @@ do_random_tests (void)
          res = CALL (impl, p2 + align2, p1 + align1, dlen);
          if (res != STRCPY_RESULT (p2 + align2, len))
            {
-             error (0, 0, "Iteration %zd - wrong result in function %s (%zd, %zd, %zd) %p != %p",
-                    n, impl->name, align1, align2, len, res,
-                    STRCPY_RESULT (p2 + align2, len));
+             printf ("\
+Iteration %zd - wrong result in function %s (%zd, %zd, %zd) %p != %p\n",
+                     n, impl->name, align1, align2, len, res,
+                     STRCPY_RESULT (p2 + align2, len));
              ret = 1;
            }
          for (j = 0; j < align2 + 64; ++j)
            {
              if (p2[j - 64] != '\1')
                {
-                 error (0, 0, "Iteration %zd - garbage before, %s (%zd, %zd, %zd)",
-                        n, impl->name, align1, align2, len);
+                 printf ("\
+Iteration %zd - garbage before, %s (%zd, %zd, %zd)\n",
+                         n, impl->name, align1, align2, len);
                  ret = 1;
                  break;
                }
@@ -262,16 +266,18 @@ do_random_tests (void)
            {
              if (p2[j] != '\1')
                {
-                 error (0, 0, "Iteration %zd - garbage after, %s (%zd, %zd, %zd)",
-                        n, impl->name, align1, align2, len);
+                 printf ("\
+Iteration %zd - garbage after, %s (%zd, %zd, %zd)\n",
+                         n, impl->name, align1, align2, len);
                  ret = 1;
                  break;
                }
            }
          if (memcmp (p1 + align1, p2 + align2, len + 1))
            {
-             error (0, 0, "Iteration %zd - different strings, %s (%zd, %zd, %zd)",
-                    n, impl->name, align1, align2, len);
+             printf ("\
+Iteration %zd - different strings, %s (%zd, %zd, %zd)\n",
+                     n, impl->name, align1, align2, len);
              ret = 1;
            }
        }
@@ -290,6 +296,17 @@ test_main (void)
 
   sigaction (SIGABRT, &sa, NULL);
 
+  /* Avoid all the buffer overflow messages on stderr.  */
+  int fd = open (_PATH_DEVNULL, O_WRONLY);
+  if (fd == -1)
+    close (STDERR_FILENO);
+  else
+    {
+      dup2 (fd, STDERR_FILENO);
+      close (fd);
+    }
+  setenv ("LIBC_FATAL_STDERR_", "1", 1);
+
   test_init ();
 
   printf ("%23s", "");
index fb2074d0bfc2ea001cf7fbe5d6ce0f8c42b5c4a2..37320c3514f458eca08a554e1e88057a39869ca2 100644 (file)
@@ -17,6 +17,8 @@
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
+#include <fcntl.h>
+#include <paths.h>
 #include <setjmp.h>
 #include <signal.h>
 #include <stdio.h>
@@ -106,6 +108,17 @@ do_test (void)
 
   sigaction (SIGABRT, &sa, NULL);
 
+  /* Avoid all the buffer overflow messages on stderr.  */
+  int fd = open (_PATH_DEVNULL, O_WRONLY);
+  if (fd == -1)
+    close (STDERR_FILENO);
+  else
+    {
+      dup2 (fd, STDERR_FILENO);
+      close (fd);
+    }
+  setenv ("LIBC_FATAL_STDERR_", "1", 1);
+
   struct A { char buf1[9]; char buf2[1]; } a;
 
   printf ("Test checking routines at fortify level %d\n",
index 05a91b4cb38532fe381cdecc32bac7fbe6681465..ad8f157829eb925f8b89e3c56babb262b95c350c 100644 (file)
@@ -62,6 +62,8 @@ extern int __gen_tempname (char *__tmpl, int __kind);
 /* Print out MESSAGE on the error output and abort.  */
 extern void __libc_fatal (__const char *__message)
      __attribute__ ((__noreturn__));
+extern void __libc_message (int do_abort, __const char *__fnt, ...)
+     __attribute__ ((__noreturn__));
 
 /* Acquire ownership of STREAM.  */
 extern void __flockfile (FILE *__stream);
index 6d6294c6e6a8578ff1cd27fa214a6ca68dc0b37c..3f4fd778078ef460e60f541242997dbe756ead4f 100644 (file)
@@ -5474,45 +5474,19 @@ malloc_printerr(int action, const char *str, void *ptr)
 {
   if (action & 1)
     {
-      /* output string will be ": ADDR ***\n"  */
-      static const char suffix[] = " ***\n";
-      static const char prefix[] = ": 0x";
-      char buf[sizeof (prefix) - 1 + sizeof (void *) * 2 + sizeof (suffix)];
-      char *cp;
-      if (action & 4)
-       cp = memcpy (&buf[sizeof (buf) - 2], "\n", 2);
-      else
-       {
-         cp = memcpy (&buf[sizeof (buf) - sizeof (suffix)], suffix,
-                      sizeof (suffix));
-         cp = _itoa_word ((unsigned long int) ptr, cp, 16, 0);
-         while (cp > &buf[sizeof (prefix) - 1])
-           *--cp = '0';
-         cp = memcpy (buf, prefix, sizeof (prefix) - 1);
-       }
+      char buf[2 * sizeof (uintptr_t) + 1];
 
-      struct iovec iov[3];
-      int n = 0;
-      if ((action & 4) == 0)
-       {
-         iov[0].iov_base = (char *) "*** glibc detected *** ";
-         iov[0].iov_len = strlen (iov[0].iov_base);
-         ++n;
-       }
-      iov[n].iov_base = (char *) str;
-      iov[n].iov_len = strlen (str);
-      ++n;
-      iov[n].iov_base = cp;
-      iov[n].iov_len = &buf[sizeof (buf) - 1] - cp;
-      ++n;
-      if (TEMP_FAILURE_RETRY (__writev (STDERR_FILENO, iov, n)) == -1
-         && errno == EBADF)
-       /* Standard error is not opened.  Try using syslog.  */
-       syslog (LOG_ERR, "%s%s%s", (char *) iov[0].iov_base,
-               (char *) iov[1].iov_base,
-               n == 3 ? (const char *) iov[2].iov_base : "");
+      buf[sizeof (buf) - 1] = '\0';
+      char *cp = _itoa_word ((uintptr_t) ptr, &buf[sizeof (buf) - 1], 16, 0);
+      while (cp > buf)
+       *--cp = '0';
+
+      __libc_message (action & 2,
+                     action & 4
+                     ? "%s\n" : "*** glibc detected *** %s: 0x%s ***\n",
+                     str, cp);
     }
-  if (action & 2)
+  else if (action & 2)
     abort ();
 }