From b32a99e5f491c83764390db17be9d213e7f60b6c Mon Sep 17 00:00:00 2001 From: Mike Makonnen Date: Fri, 23 May 2003 10:28:13 +0000 Subject: [PATCH] EDOOFUS 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 --- lib/libthr/thread/thr_kern.c | 12 ++---------- lib/libthr/thread/thr_private.h | 1 + 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/lib/libthr/thread/thr_kern.c b/lib/libthr/thread/thr_kern.c index 7d10c5fe5540..77b0094e0738 100644 --- a/lib/libthr/thread/thr_kern.c +++ b/lib/libthr/thread/thr_kern.c @@ -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); diff --git a/lib/libthr/thread/thr_private.h b/lib/libthr/thread/thr_private.h index f0cfd561668d..10fdda0d6196 100644 --- a/lib/libthr/thread/thr_private.h +++ b/lib/libthr/thread/thr_private.h @@ -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.