diff --git a/src/client/linux/handler/exception_handler.cc b/src/client/linux/handler/exception_handler.cc index 823823d4..fff2d1c6 100644 --- a/src/client/linux/handler/exception_handler.cc +++ b/src/client/linux/handler/exception_handler.cc @@ -187,14 +187,18 @@ bool ExceptionHandler::InstallHandlers() { // such a small stack. static const unsigned kSigStackSize = 8192; - signal_stack = malloc(kSigStackSize); stack_t stack; - memset(&stack, 0, sizeof(stack)); - stack.ss_sp = signal_stack; - stack.ss_size = kSigStackSize; + // Only set an alternative stack if there isn't already one, or if the current + // one is too small. + if (sys_sigaltstack(NULL, &stack) == -1 || !stack.ss_sp || + stack.ss_size < kSigStackSize) { + memset(&stack, 0, sizeof(stack)); + stack.ss_sp = malloc(kSigStackSize); + stack.ss_size = kSigStackSize; - if (sys_sigaltstack(&stack, NULL) == -1) - return false; + if (sys_sigaltstack(&stack, NULL) == -1) + return false; + } struct sigaction sa; memset(&sa, 0, sizeof(sa)); diff --git a/src/client/linux/handler/exception_handler.h b/src/client/linux/handler/exception_handler.h index e75517ea..94766eba 100644 --- a/src/client/linux/handler/exception_handler.h +++ b/src/client/linux/handler/exception_handler.h @@ -228,7 +228,6 @@ class ExceptionHandler { const char* next_minidump_id_c_; const bool handler_installed_; - void* signal_stack; // the handler stack. HandlerCallback crash_handler_; // The global exception handler stack. This is need becuase there may exist