From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Brian Gianforcaro Date: Sat, 19 Feb 2022 19:46:06 -0800 Subject: [PATCH] gdb: Disable xmalloc for alternate_signal_stack for serenity --- 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 +#include namespace gdb { @@ -36,31 +38,44 @@ class alternate_signal_stack public: alternate_signal_stack () { + // We can't use xmalloc here on Serenity, 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 m_stack; + void *m_stack{ nullptr }; stack_t m_old_stack; #endif };