From a9055cab7ac609b96984179194c7a2ec410c8e2b Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Sat, 13 Nov 2004 03:13:00 +0000 Subject: [PATCH] Update. 2004-11-12 Ulrich Drepper * 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 | 16 ++++++++++++++ debug/chk_fail.c | 14 +++--------- debug/test-strcpy_chk.c | 49 +++++++++++++++++++++++++++-------------- debug/tst-chk1.c | 13 +++++++++++ include/stdio.h | 2 ++ malloc/malloc.c | 48 +++++++++------------------------------- 6 files changed, 78 insertions(+), 64 deletions(-) diff --git a/ChangeLog b/ChangeLog index b62c2e1130..1888ce03c0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +2004-11-12 Ulrich Drepper + + * 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 * elf/elf.h: Add 20 bit relocations R_390_*20. diff --git a/debug/chk_fail.c b/debug/chk_fail.c index 48848fbe35..dc1c3d70b6 100644 --- a/debug/chk_fail.c +++ b/debug/chk_fail.c @@ -1,3 +1,4 @@ + /* Copyright (C) 2004 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -16,23 +17,14 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ +#include #include -#include -#include 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) diff --git a/debug/test-strcpy_chk.c b/debug/test-strcpy_chk.c index 4c61f4fb43..ac9f9448cf 100644 --- a/debug/test-strcpy_chk.c +++ b/debug/test-strcpy_chk.c @@ -46,6 +46,8 @@ simple_strcpy_chk (char *dst, const char *src, size_t len) } #endif +#include +#include #include #include @@ -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", ""); diff --git a/debug/tst-chk1.c b/debug/tst-chk1.c index fb2074d0bf..37320c3514 100644 --- a/debug/tst-chk1.c +++ b/debug/tst-chk1.c @@ -17,6 +17,8 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ +#include +#include #include #include #include @@ -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", diff --git a/include/stdio.h b/include/stdio.h index 05a91b4cb3..ad8f157829 100644 --- a/include/stdio.h +++ b/include/stdio.h @@ -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); diff --git a/malloc/malloc.c b/malloc/malloc.c index 6d6294c6e6..3f4fd77807 100644 --- a/malloc/malloc.c +++ b/malloc/malloc.c @@ -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 (); }