Preserve a pointer to the newly allocated signal stack as well. That too
authorChandler Carruth <chandlerc@gmail.com>
Wed, 24 Aug 2016 03:42:51 +0000 (03:42 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Wed, 24 Aug 2016 03:42:51 +0000 (03:42 +0000)
is flagged by LSan at least among leak detectors.

llvm-svn: 279605

llvm/lib/Support/Unix/Signals.inc

index 6a35656..961f32b 100644 (file)
@@ -120,11 +120,12 @@ static void RegisterHandler(int Signal) {
 }
 
 #if defined(HAVE_SIGALTSTACK)
-// Hold onto the old alternate signal stack so that it's not reported as a leak.
-// We don't make any attempt to remove our alt signal stack if we remove our
-// signal handlers; that can't be done reliably if someone else is also trying
-// to do the same thing.
+// Hold onto both the old and new alternate signal stack so that it's not
+// reported as a leak. We don't make any attempt to remove our alt signal
+// stack if we remove our signal handlers; that can't be done reliably if
+// someone else is also trying to do the same thing.
 static stack_t OldAltStack;
+static void* NewAltStackPointer;
 
 static void CreateSigAltStack() {
   const size_t AltStackSize = MINSIGSTKSZ + 64 * 1024;
@@ -140,6 +141,7 @@ static void CreateSigAltStack() {
 
   stack_t AltStack = {};
   AltStack.ss_sp = reinterpret_cast<char *>(malloc(AltStackSize));
+  NewAltStackPointer = AltStack.ss_sp; // Save to avoid reporting a leak.
   AltStack.ss_size = AltStackSize;
   if (sigaltstack(&AltStack, &OldAltStack) != 0)
     free(AltStack.ss_sp);