Newer
Older
minerva / Ports / gdb / patches / 0001-gdb-Disable-xmalloc-for-alternate_signal_stack-for-s.patch
@minerva minerva on 13 Jul 1 KB Initial commit
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Brian Gianforcaro <b.gianfo@gmail.com>
Date: Sat, 19 Feb 2022 19:46:06 -0800
Subject: [PATCH] gdb: Disable xmalloc for alternate_signal_stack for minerva

---
 gdbsupport/alt-stack.h | 37 ++++++++++++++++++++++++++-----------
 1 file changed, 26 insertions(+), 11 deletions(-)

diff --git a/gdbsupport/alt-stack.h b/gdbsupport/alt-stack.h
index 8ae229b..6e5b133 100644
--- a/gdbsupport/alt-stack.h
+++ b/gdbsupport/alt-stack.h
@@ -20,7 +20,9 @@
 #ifndef GDBSUPPORT_ALT_STACK_H
 #define GDBSUPPORT_ALT_STACK_H
 
+#include "common-defs.h"
 #include <signal.h>
+#include <sys/mman.h>
 
 namespace gdb
 {
@@ -36,31 +38,44 @@ class alternate_signal_stack
 public:
   alternate_signal_stack ()
   {
+    // We can't use xmalloc here on Minerva, because stack regions
+    // do not play well with how malloc manages its memory.
 #ifdef HAVE_SIGALTSTACK
-    m_stack.reset ((char *) xmalloc (SIGSTKSZ));
-
-    stack_t stack;
-    stack.ss_sp = m_stack.get ();
-    stack.ss_size = SIGSTKSZ;
-    stack.ss_flags = 0;
-
-    sigaltstack (&stack, &m_old_stack);
+    void *ptr = mmap (nullptr, SIGSTKSZ, PROT_READ | PROT_WRITE,
+                      MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+    if (ptr == MAP_FAILED)
+      {
+        warning ("could not mmap alternate signal stack");
+      }
+    else
+      {
+        m_stack = ptr;
+        stack_t stack;
+        stack.ss_sp = m_stack;
+        stack.ss_size = SIGSTKSZ;
+        stack.ss_flags = 0;
+
+        sigaltstack (&stack, &m_old_stack);
+      }
 #endif
   }
 
   ~alternate_signal_stack ()
   {
 #ifdef HAVE_SIGALTSTACK
-    sigaltstack (&m_old_stack, nullptr);
+    if (m_stack != nullptr)
+      {
+        sigaltstack (&m_old_stack, nullptr);
+        munmap (m_stack, SIGSTKSZ);
+      }
 #endif
   }
 
   DISABLE_COPY_AND_ASSIGN (alternate_signal_stack);
 
 private:
-
 #ifdef HAVE_SIGALTSTACK
-  gdb::unique_xmalloc_ptr<char> m_stack;
+  void *m_stack{ nullptr };
   stack_t m_old_stack;
 #endif
 };