From eb4463fde63561149e643ee41e628f39ae4937e0 Mon Sep 17 00:00:00 2001 From: Daniel Eischen Date: Tue, 14 Nov 2000 20:00:19 +0000 Subject: When entering the scheduler from the signal handler, tell the kernel to (re)use the alternate signal stack. In this case, we don't return normally from the signal handler, so the kernel still thinks we are using the signal stack. The fixes a nasty bug where the signal handler can start fiddling with the stack of a thread while the handler is actually running on the same stack. MFC candidate --- lib/libpthread/thread/thr_init.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) (limited to 'lib/libpthread/thread/thr_init.c') diff --git a/lib/libpthread/thread/thr_init.c b/lib/libpthread/thread/thr_init.c index 35731c42cbd6f..be671a139c422 100644 --- a/lib/libpthread/thread/thr_init.c +++ b/lib/libpthread/thread/thr_init.c @@ -92,7 +92,6 @@ _thread_init(void) int mib[2]; struct clockinfo clockinfo; struct sigaction act; - struct sigaltstack alt; /* Check if this function has already been called: */ if (_thread_initial) @@ -281,11 +280,15 @@ _thread_init(void) /* Clear the signal queue: */ memset(_thread_sigq, 0, sizeof(_thread_sigq)); - /* Create and install an alternate signal stack: */ - alt.ss_sp = malloc(SIGSTKSZ); /* recommended stack size */ - alt.ss_size = SIGSTKSZ; - alt.ss_flags = 0; - if (_thread_sys_sigaltstack(&alt, NULL) != 0) + /* + * Create and install an alternate signal stack of + * the recommended size: + */ + _thread_sigstack.ss_sp = malloc(SIGSTKSZ); + _thread_sigstack.ss_size = SIGSTKSZ; + _thread_sigstack.ss_flags = 0; + if ((_thread_sigstack.ss_sp == NULL) || + (_thread_sys_sigaltstack(&_thread_sigstack, NULL) != 0)) PANIC("Unable to install alternate signal stack"); /* Enter a loop to get the existing signal status: */ -- cgit v1.3