#if !HAVE_MACH_EXCEPTIONS
bool g_registered_signal_handlers = false;
+bool g_enable_alternate_stack_check = false;
#endif // !HAVE_MACH_EXCEPTIONS
+
static bool g_registered_sigterm_handler = false;
struct sigaction g_previous_sigterm;
TRACE("Initializing signal handlers\n");
#if !HAVE_MACH_EXCEPTIONS
+
+ char* enableAlternateStackCheck = getenv("COMPlus_EnableAlternateStackCheck");
+
+ g_enable_alternate_stack_check = enableAlternateStackCheck && (strtoul(enableAlternateStackCheck, NULL, 10) != 0);
+
if (flags & PAL_INITIALIZE_REGISTER_SIGNALS)
{
g_registered_signal_handlers = true;
--*/
bool IsRunningOnAlternateStack(void *context)
{
- stack_t *signalStack = &((native_context_t *)context)->uc_stack;
- // Check if the signalStack local variable address is within the alternate stack range. If it is not,
- // then either the alternate stack was not installed at all or the current method is not running on it.
- void* alternateStackEnd = (char *)signalStack->ss_sp + signalStack->ss_size;
- return ((signalStack->ss_flags & SS_DISABLE) == 0) && (signalStack->ss_sp <= &signalStack) && (&signalStack < alternateStackEnd);
+ bool isRunningOnAlternateStack;
+ if (g_enable_alternate_stack_check)
+ {
+ // Note: WSL doesn't return the alternate signal ranges in the uc_stack (the whole structure is zeroed no
+ // matter whether the code is running on an alternate stack or not). So the check would always fail on WSL.
+ stack_t *signalStack = &((native_context_t *)context)->uc_stack;
+ // Check if the signalStack local variable address is within the alternate stack range. If it is not,
+ // then either the alternate stack was not installed at all or the current method is not running on it.
+ void* alternateStackEnd = (char *)signalStack->ss_sp + signalStack->ss_size;
+ isRunningOnAlternateStack = ((signalStack->ss_flags & SS_DISABLE) == 0) && (signalStack->ss_sp <= &signalStack) && (&signalStack < alternateStackEnd);
+ }
+ else
+ {
+ // If alternate stack check is disabled, consider always that we are running on an alternate
+ // signal handler stack.
+ isRunningOnAlternateStack = true;
+ }
+
+ return isRunningOnAlternateStack;
}
/*++