diff options
author | davidxu <davidxu@FreeBSD.org> | 2003-07-07 04:28:23 +0000 |
---|---|---|
committer | davidxu <davidxu@FreeBSD.org> | 2003-07-07 04:28:23 +0000 |
commit | 8aa4e2d6856d1eed699b30ccca6163f8e501e183 (patch) | |
tree | 6539674ba4c0ff3018faf64006ac81eb9090ec5f /lib/libpthread/thread/thr_sigpending.c | |
parent | e95dd66c1f7fd662d47b34b5d83f1dcaa8b150e3 (diff) | |
download | FreeBSD-src-8aa4e2d6856d1eed699b30ccca6163f8e501e183.zip FreeBSD-src-8aa4e2d6856d1eed699b30ccca6163f8e501e183.tar.gz |
Avoid accessing user provided parameters in critical region.
Reviewed by: deischen
Diffstat (limited to 'lib/libpthread/thread/thr_sigpending.c')
-rw-r--r-- | lib/libpthread/thread/thr_sigpending.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/lib/libpthread/thread/thr_sigpending.c b/lib/libpthread/thread/thr_sigpending.c index 1b9b502..1edf01f 100644 --- a/lib/libpthread/thread/thr_sigpending.c +++ b/lib/libpthread/thread/thr_sigpending.c @@ -46,6 +46,7 @@ _sigpending(sigset_t *set) { struct pthread *curthread = _get_curthread(); kse_critical_t crit; + sigset_t sigset; int ret = 0; /* Check for a null signal set pointer: */ @@ -59,12 +60,13 @@ _sigpending(sigset_t *set) crit = _kse_critical_enter(); KSE_SCHED_LOCK(curthread->kse, curthread->kseg); - *set = curthread->sigpend; + sigset = curthread->sigpend; KSE_SCHED_UNLOCK(curthread->kse, curthread->kseg); KSE_LOCK_ACQUIRE(curthread->kse, &_thread_signal_lock); - SIGSETOR(*set, _thr_proc_sigpending); + SIGSETOR(sigset, _thr_proc_sigpending); KSE_LOCK_RELEASE(curthread->kse, &_thread_signal_lock); _kse_critical_leave(crit); + *set = sigset; } /* Return the completion status: */ return (ret); |