Skip to content

Commit

Permalink
Exception: Don't trust sigaltstack().
Browse files Browse the repository at this point in the history
Let's just track our allocation separately and free it, always.
  • Loading branch information
unknownbrackets committed Aug 27, 2020
1 parent a8059d5 commit 90344fd
Showing 1 changed file with 11 additions and 6 deletions.
17 changes: 11 additions & 6 deletions Common/ExceptionHandlerSetup.cpp
Expand Up @@ -21,6 +21,7 @@
#include "Common/MachineContext.h"

static BadAccessHandler g_badAccessHandler;
static void *altStack = nullptr;

#ifdef MACHINE_CONTEXT_SUPPORTED

Expand Down Expand Up @@ -287,10 +288,11 @@ void InstallExceptionHandler(BadAccessHandler badAccessHandler) {
g_badAccessHandler = badAccessHandler;

stack_t signal_stack{};
altStack = malloc(SIGSTKSZ);
#ifdef __FreeBSD__
signal_stack.ss_sp = (char*)malloc(SIGSTKSZ);
signal_stack.ss_sp = (char*)altStack;
#else
signal_stack.ss_sp = malloc(SIGSTKSZ);
signal_stack.ss_sp = altStack;
#endif
signal_stack.ss_size = SIGSTKSZ;
signal_stack.ss_flags = 0;
Expand All @@ -300,7 +302,7 @@ void InstallExceptionHandler(BadAccessHandler badAccessHandler) {
struct sigaction sa{};
sa.sa_handler = nullptr;
sa.sa_sigaction = &sigsegv_handler;
sa.sa_flags = SA_SIGINFO;
sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
sigemptyset(&sa.sa_mask);
sigaction(SIGSEGV, &sa, &old_sa_segv);
#ifdef __APPLE__
Expand All @@ -313,10 +315,13 @@ void UninstallExceptionHandler() {
return;
}
stack_t signal_stack{};
stack_t old_stack{};
signal_stack.ss_flags = SS_DISABLE;
if (0 == sigaltstack(&signal_stack, &old_stack) && !(old_stack.ss_flags & SS_DISABLE)) {
free(old_stack.ss_sp);
if (0 != sigaltstack(&signal_stack, nullptr)) {
ERROR_LOG(SYSTEM, "Could not remove signal altstack");
}
if (altStack) {
free(altStack);
altStack = nullptr;
}
sigaction(SIGSEGV, &old_sa_segv, nullptr);
#ifdef __APPLE__
Expand Down

0 comments on commit 90344fd

Please sign in to comment.