summaryrefslogtreecommitdiffstats
path: root/lib/libpthread/thread/thr_sigpending.c
diff options
context:
space:
mode:
authordavidxu <davidxu@FreeBSD.org>2003-07-07 04:28:23 +0000
committerdavidxu <davidxu@FreeBSD.org>2003-07-07 04:28:23 +0000
commit8aa4e2d6856d1eed699b30ccca6163f8e501e183 (patch)
tree6539674ba4c0ff3018faf64006ac81eb9090ec5f /lib/libpthread/thread/thr_sigpending.c
parente95dd66c1f7fd662d47b34b5d83f1dcaa8b150e3 (diff)
downloadFreeBSD-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.c6
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);
OpenPOWER on IntegriCloud