Fix sigwait and pthread_kill return values in case of error

* signal.cc (sigwait): Fix return value to reflect errno in case of
	error according to POSIX.  Never return EINTR.
	* thread.cc (pthread_kill): Return errno if sig_send failed.

Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
Corinna Vinschen 2015-10-30 16:05:43 +01:00
parent ff3c4a7d2f
commit 8f97c045b8
4 changed files with 23 additions and 3 deletions

View File

@ -1,3 +1,9 @@
2015-10-30 Corinna Vinschen <corinna@vinschen.de>
* signal.cc (sigwait): Fix return value to reflect errno in case of
error according to POSIX. Never return EINTR.
* thread.cc (pthread_kill): Return errno if sig_send failed.
2015-10-29 Qian Hong <qhong@codeweavers.com>
* init.cc (munge_threadfunc): Check that we're actually replacing

View File

@ -53,3 +53,7 @@ Bug Fixes
- Fix a potential SEGV on (at least) Wine.
Addresses: https://cygwin.com/ml/cygwin/2015-10/msg00018.html
- Fix sigwait(3) to return errno instead of -1 and never to return with EINTR.
- Fix pthread_kill(3) to return errno instead of -1.

View File

@ -557,10 +557,16 @@ siginterrupt (int sig, int flag)
extern "C" int
sigwait (const sigset_t *set, int *sig_ptr)
{
int sig = sigwaitinfo (set, NULL);
int sig;
do
{
sig = sigwaitinfo (set, NULL);
}
while (sig == -1 && get_errno () == EINTR);
if (sig > 0)
*sig_ptr = sig;
return sig > 0 ? 0 : -1;
return sig > 0 ? 0 : get_errno ();
}
extern "C" int

View File

@ -3056,7 +3056,11 @@ pthread_kill (pthread_t thread, int sig)
if (!thread->valid)
rval = ESRCH;
else if (sig)
rval = sig_send (NULL, si, thread->cygtls);
{
rval = sig_send (NULL, si, thread->cygtls);
if (rval == -1)
rval = get_errno ();
}
else
switch (WaitForSingleObject (thread->win32_obj_id, 0))
{