mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-12 16:20:06 +00:00
Update.
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.
This commit is contained in:
parent
1327439fc6
commit
a9055cab7a
16
ChangeLog
16
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.
|
||||
|
@ -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 <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)
|
||||
|
@ -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", "");
|
||||
|
@ -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",
|
||||
|
@ -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);
|
||||
|
@ -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 ();
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user