backtrace.c (backtrace_full): When testing whether we can allocate memory...
authorIan Lance Taylor <iant@golang.org>
Tue, 17 Apr 2018 13:59:38 +0000 (13:59 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Tue, 17 Apr 2018 13:59:38 +0000 (13:59 +0000)
* 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
libbacktrace/backtrace.c

index 85c8742b8a8fe7608617c06c40c4515921d881a9..b26da88223f5f52af7f1261b1145a7c6f7d2a783 100644 (file)
@@ -1,3 +1,8 @@
+2018-04-17  Ian Lance Taylor  <iant@golang.org>
+
+       * backtrace.c (backtrace_full): When testing whether we can
+       allocate memory, call mmap directly, and munmap the memory.
+
 2018-04-04  Jakub Jelinek  <jakub@redhat.com>
 
        PR other/85161
index f8e3dc59d45039a037800231ddd8ad170a1dd5e6..319edcf12eb963065a1ca405f8dc6c64fd44d69d 100644 (file)
@@ -32,12 +32,26 @@ POSSIBILITY OF SUCH DAMAGE.  */
 
 #include "config.h"
 
+#include <unistd.h>
 #include <sys/types.h>
 
+#if !BACKTRACE_USES_MALLOC
+#include <sys/mman.h>
+#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;