From 83a658ca0b5164509f86a2b674192e50a934c6db Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 17 Apr 2018 13:59:38 +0000 Subject: [PATCH] backtrace.c (backtrace_full): When testing whether we can allocate memory... * backtrace.c (backtrace_full): When testing whether we can allocate memory, call mmap directly, and munmap the memory. Fixes https://github.com/ianlancetaylor/libbacktrace/issues/13 . From-SVN: r259434 --- libbacktrace/ChangeLog | 5 +++++ libbacktrace/backtrace.c | 44 ++++++++++++++++++++++++++++++---------- 2 files changed, 38 insertions(+), 11 deletions(-) diff --git a/libbacktrace/ChangeLog b/libbacktrace/ChangeLog index 85c8742b8a8..b26da88223f 100644 --- a/libbacktrace/ChangeLog +++ b/libbacktrace/ChangeLog @@ -1,3 +1,8 @@ +2018-04-17 Ian Lance Taylor + + * backtrace.c (backtrace_full): When testing whether we can + allocate memory, call mmap directly, and munmap the memory. + 2018-04-04 Jakub Jelinek PR other/85161 diff --git a/libbacktrace/backtrace.c b/libbacktrace/backtrace.c index f8e3dc59d45..319edcf12eb 100644 --- a/libbacktrace/backtrace.c +++ b/libbacktrace/backtrace.c @@ -32,12 +32,26 @@ POSSIBILITY OF SUCH DAMAGE. */ #include "config.h" +#include #include +#if !BACKTRACE_USES_MALLOC +#include +#endif + #include "unwind.h" #include "backtrace.h" +#include "backtrace-supported.h" #include "internal.h" +#ifndef MAP_ANONYMOUS +#define MAP_ANONYMOUS MAP_ANON +#endif + +#ifndef MAP_FAILED +#define MAP_FAILED ((void *)-1) +#endif + /* The main backtrace_full routine. */ /* Data passed through _Unwind_Backtrace. */ @@ -104,7 +118,6 @@ backtrace_full (struct backtrace_state *state, int skip, backtrace_error_callback error_callback, void *data) { struct backtrace_data bdata; - void *p; bdata.skip = skip + 1; bdata.state = state; @@ -113,16 +126,25 @@ backtrace_full (struct backtrace_state *state, int skip, bdata.data = data; bdata.ret = 0; - /* If we can't allocate any memory at all, don't try to produce - file/line information. */ - p = backtrace_alloc (state, 4096, NULL, NULL); - if (p == NULL) - bdata.can_alloc = 0; - else - { - backtrace_free (state, p, 4096, NULL, NULL); - bdata.can_alloc = 1; - } +#if !BACKTRACE_USES_MALLOC + { + size_t pagesize; + void *page; + + /* If we can't allocate any memory at all, don't try to produce + file/line information. */ + pagesize = getpagesize (); + page = mmap (NULL, pagesize, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + if (page == MAP_FAILED) + bdata.can_alloc = 0; + else + { + munmap (page, pagesize); + bdata.can_alloc = 1; + } + } +#endif _Unwind_Backtrace (unwind, &bdata); return bdata.ret; -- 2.30.2