mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-31 20:27:11 +01:00 
			
		
		
		
	Ensure stack size for POSIX signal handling is sufficient
Until now, the stack size for POSIX signal handling was determined by the implementation defined limit `STKSZ`, which in some cases turned out to be insufficient, leading to stack overflow inside the signal handler. The new size, which was determined experimentally, is the larger of 32kb or `MINSTKSZ`. Fixes #1225
This commit is contained in:
		 BiCapitalization
					BiCapitalization
				
			
				
					committed by
					
						 Martin Hořeňovský
						Martin Hořeňovský
					
				
			
			
				
	
			
			
			 Martin Hořeňovský
						Martin Hořeňovský
					
				
			
						parent
						
							df0b0e64e1
						
					
				
				
					commit
					88d7b8da25
				
			| @@ -94,6 +94,11 @@ namespace Catch { | ||||
|         int id; | ||||
|         const char* name; | ||||
|     }; | ||||
|      | ||||
|     // 32kb for the alternate stack seems to be sufficient. However, this value | ||||
|     // is experimentally determined, so that's not guaranteed. | ||||
|     constexpr static std::size_t sigStackSize = 32768 >= MINSIGSTKSZ ? 32768 : MINSIGSTKSZ; | ||||
|  | ||||
|     static SignalDefs signalDefs[] = { | ||||
|         { SIGINT,  "SIGINT - Terminal interrupt signal" }, | ||||
|         { SIGILL,  "SIGILL - Illegal instruction signal" }, | ||||
| @@ -121,7 +126,7 @@ namespace Catch { | ||||
|         isSet = true; | ||||
|         stack_t sigStack; | ||||
|         sigStack.ss_sp = altStackMem; | ||||
|         sigStack.ss_size = SIGSTKSZ; | ||||
|         sigStack.ss_size = sigStackSize; | ||||
|         sigStack.ss_flags = 0; | ||||
|         sigaltstack(&sigStack, &oldSigStack); | ||||
|         struct sigaction sa = { }; | ||||
| @@ -153,7 +158,7 @@ namespace Catch { | ||||
|     bool FatalConditionHandler::isSet = false; | ||||
|     struct sigaction FatalConditionHandler::oldSigActions[sizeof(signalDefs)/sizeof(SignalDefs)] = {}; | ||||
|     stack_t FatalConditionHandler::oldSigStack = {}; | ||||
|     char FatalConditionHandler::altStackMem[SIGSTKSZ] = {}; | ||||
|     char FatalConditionHandler::altStackMem[sigStackSize] = {}; | ||||
|  | ||||
|  | ||||
| } // namespace Catch | ||||
|   | ||||
		Reference in New Issue
	
	Block a user