In _pthread_kill(), if passed pthread is current thread, do not send

the signal second time, by adding the missed else before if statement.

While there, postpone initializing local curthread variable until
passed signal number is checked for validity.

Submitted by:	John Wolfe <jlw@xinuos.com>
PR:	threads/186309
MFC after:	1 week
This commit is contained in:
Konstantin Belousov 2014-02-01 18:13:18 +00:00
parent a865b1a02e
commit 082aa03e4b
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=261354

View File

@ -42,24 +42,27 @@ __weak_reference(_pthread_kill, pthread_kill);
int
_pthread_kill(pthread_t pthread, int sig)
{
struct pthread *curthread = _get_curthread();
struct pthread *curthread;
int ret;
/* Check for invalid signal numbers: */
if (sig < 0 || sig > _SIG_MAXSIG)
/* Invalid signal: */
ret = EINVAL;
return (EINVAL);
curthread = _get_curthread();
/*
* Ensure the thread is in the list of active threads, and the
* signal is valid (signal 0 specifies error checking only) and
* not being ignored:
*/
else if (curthread == pthread) {
if (curthread == pthread) {
if (sig > 0)
_thr_send_sig(pthread, sig);
ret = 0;
} if ((ret = _thr_find_thread(curthread, pthread, /*include dead*/0))
== 0) {
} else if ((ret = _thr_find_thread(curthread, pthread,
/*include dead*/0)) == 0) {
if (sig > 0)
_thr_send_sig(pthread, sig);
THR_THREAD_UNLOCK(curthread, pthread);