Prevent one thread from messing up another thread's saved signal
mask by saving it in struct pthread instead of leaving it as a
global variable. D'oh!

Approved by:	re/blanket libthr
This commit is contained in:
Mike Makonnen 2003-05-23 10:28:13 +00:00
parent 7d9d7ca2ed
commit b32a99e5f4
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=115261
2 changed files with 3 additions and 10 deletions

View File

@ -73,8 +73,7 @@ _thread_critical_enter(pthread_t pthread)
errno);
abort();
}
restore = sav;
curthread->savedsig = sav;
}
void
@ -82,17 +81,10 @@ _thread_critical_exit(pthread_t pthread)
{
sigset_t set;
/*
* restore is protected by giant. We could restore our signal state
* incorrectly if someone else set restore between unlocking giant
* and restoring the signal mask. To avoid this we cache a copy prior
* to the unlock.
*/
set = restore;
/*
* Restore signals.
*/
set = curthread->savedsig;
if (__sys_sigprocmask(SIG_SETMASK, &set, NULL)) {
_thread_printf(STDERR_FILENO, "Critical Exit: sig err %d\n",
errno);

View File

@ -425,6 +425,7 @@ struct pthread {
char *name;
u_int64_t uniqueid; /* for gdb */
thr_id_t thr_id;
sigset_t savedsig;
/*
* Lock for accesses to this thread structure.