mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-28 00:21:52 +03:00
Use mmap for allocation of buffers used for __abort_msg
This commit is contained in:
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1993-1995,1997,2000,2002-2005,2009
|
||||
/* Copyright (C) 1993-1995,1997,2000,2002-2005,2009,2011
|
||||
Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
@ -20,6 +20,7 @@
|
||||
#include <atomic.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <ldsodefs.h>
|
||||
#include <paths.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdbool.h>
|
||||
@ -28,6 +29,7 @@
|
||||
#include <string.h>
|
||||
#include <sysdep.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/syslog.h>
|
||||
#include <execinfo.h>
|
||||
|
||||
@ -134,18 +136,28 @@ __libc_message (int do_abort, const char *fmt, ...)
|
||||
if (cnt == total)
|
||||
written = true;
|
||||
|
||||
char *buf = do_abort ? malloc (total + 1) : NULL;
|
||||
if (buf != NULL)
|
||||
if (do_abort)
|
||||
{
|
||||
char *wp = buf;
|
||||
for (int cnt = 0; cnt < nlist; ++cnt)
|
||||
wp = mempcpy (wp, iov[cnt].iov_base, iov[cnt].iov_len);
|
||||
*wp = '\0';
|
||||
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. */
|
||||
char *old = atomic_exchange_acq (&__abort_msg, buf);
|
||||
free (old);
|
||||
/* 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user