diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/thread/pthread_create.c | 11 | ||||
| -rw-r--r-- | src/thread/pthread_getschedparam.c | 3 | ||||
| -rw-r--r-- | src/thread/pthread_kill.c | 3 | ||||
| -rw-r--r-- | src/thread/pthread_setschedparam.c | 3 | ||||
| -rw-r--r-- | src/thread/pthread_setschedprio.c | 3 | 
5 files changed, 18 insertions, 5 deletions
| diff --git a/src/thread/pthread_create.c b/src/thread/pthread_create.c index 6bdfb44f..10f1b7d8 100644 --- a/src/thread/pthread_create.c +++ b/src/thread/pthread_create.c @@ -72,12 +72,13 @@ _Noreturn void __pthread_exit(void *result)  	/* Access to target the exiting thread with syscalls that use  	 * its kernel tid is controlled by killlock. For detached threads,  	 * any use past this point would have undefined behavior, but for -	 * joinable threads it's a valid usage that must be handled. */ +	 * joinable threads it's a valid usage that must be handled. +	 * Signals must be blocked since pthread_kill must be AS-safe. */ +	__block_app_sigs(&set);  	LOCK(self->killlock); -	/* The thread list lock must be AS-safe, and thus requires -	 * application signals to be blocked before it can be taken. */ -	__block_app_sigs(&set); +	/* The thread list lock must be AS-safe, and thus depends on +	 * application signals being blocked above. */  	__tl_lock();  	/* If this is the only thread in the list, don't proceed with @@ -85,8 +86,8 @@ _Noreturn void __pthread_exit(void *result)  	 * signal state to prepare for exit to call atexit handlers. */  	if (self->next == self) {  		__tl_unlock(); -		__restore_sigs(&set);  		UNLOCK(self->killlock); +		__restore_sigs(&set);  		exit(0);  	} diff --git a/src/thread/pthread_getschedparam.c b/src/thread/pthread_getschedparam.c index 1cba073d..c098befb 100644 --- a/src/thread/pthread_getschedparam.c +++ b/src/thread/pthread_getschedparam.c @@ -4,6 +4,8 @@  int pthread_getschedparam(pthread_t t, int *restrict policy, struct sched_param *restrict param)  {  	int r; +	sigset_t set; +	__block_app_sigs(&set);  	LOCK(t->killlock);  	if (!t->tid) {  		r = ESRCH; @@ -14,5 +16,6 @@ int pthread_getschedparam(pthread_t t, int *restrict policy, struct sched_param  		}  	}  	UNLOCK(t->killlock); +	__restore_sigs(&set);  	return r;  } diff --git a/src/thread/pthread_kill.c b/src/thread/pthread_kill.c index 3d9395cb..446254b6 100644 --- a/src/thread/pthread_kill.c +++ b/src/thread/pthread_kill.c @@ -4,9 +4,12 @@  int pthread_kill(pthread_t t, int sig)  {  	int r; +	sigset_t set; +	__block_app_sigs(&set);  	LOCK(t->killlock);  	r = t->tid ? -__syscall(SYS_tkill, t->tid, sig)  		: (sig+0U >= _NSIG ? EINVAL : 0);  	UNLOCK(t->killlock); +	__restore_sigs(&set);  	return r;  } diff --git a/src/thread/pthread_setschedparam.c b/src/thread/pthread_setschedparam.c index 038d13d8..76d4d45a 100644 --- a/src/thread/pthread_setschedparam.c +++ b/src/thread/pthread_setschedparam.c @@ -4,8 +4,11 @@  int pthread_setschedparam(pthread_t t, int policy, const struct sched_param *param)  {  	int r; +	sigset_t set; +	__block_app_sigs(&set);  	LOCK(t->killlock);  	r = !t->tid ? ESRCH : -__syscall(SYS_sched_setscheduler, t->tid, policy, param);  	UNLOCK(t->killlock); +	__restore_sigs(&set);  	return r;  } diff --git a/src/thread/pthread_setschedprio.c b/src/thread/pthread_setschedprio.c index 5bf4a019..fc2e13dd 100644 --- a/src/thread/pthread_setschedprio.c +++ b/src/thread/pthread_setschedprio.c @@ -4,8 +4,11 @@  int pthread_setschedprio(pthread_t t, int prio)  {  	int r; +	sigset_t set; +	__block_app_sigs(&set);  	LOCK(t->killlock);  	r = !t->tid ? ESRCH : -__syscall(SYS_sched_setparam, t->tid, &prio);  	UNLOCK(t->killlock); +	__restore_sigs(&set);  	return r;  } | 
