aboutsummaryrefslogtreecommitdiff
path: root/src/client/linux/handler/exception_handler.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/linux/handler/exception_handler.cc')
-rw-r--r--src/client/linux/handler/exception_handler.cc18
1 files changed, 11 insertions, 7 deletions
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;
-
- if (sys_sigaltstack(&stack, NULL) == -1)
- return false;
+ // 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;
+ }
struct sigaction sa;
memset(&sa, 0, sizeof(sa));