mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 22:02:44 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			79 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| 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 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 <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 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<char> m_stack;
 | |
| +  void *m_stack{ nullptr };
 | |
|    stack_t m_old_stack;
 | |
|  #endif
 | |
|  };
 | 
