This is the mail archive of the
cygwin-cvs@cygwin.com
mailing list for the Cygwin project.
[newlib-cygwin/cygwin-acl] Fix sigwait and pthread_kill return values in case of error
- From: Corinna Vinschen <corinna at sourceware dot org>
- To: cygwin-cvs at sourceware dot org
- Date: 2 Nov 2015 14:39:12 -0000
- Subject: [newlib-cygwin/cygwin-acl] Fix sigwait and pthread_kill return values in case of error
https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=d7a156418fbca7c6bc84061dd7d9f460bcd95eaa
commit d7a156418fbca7c6bc84061dd7d9f460bcd95eaa
Author: Corinna Vinschen <corinna@vinschen.de>
Date: Fri Oct 30 16:05:43 2015 +0100
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>
Diff:
---
winsup/cygwin/ChangeLog | 6 ++++++
winsup/cygwin/release/2.3.0 | 4 ++++
winsup/cygwin/signal.cc | 10 ++++++++--
winsup/cygwin/thread.cc | 6 +++++-
4 files changed, 23 insertions(+), 3 deletions(-)
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index ef55389..b4b0f69 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -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
diff --git a/winsup/cygwin/release/2.3.0 b/winsup/cygwin/release/2.3.0
index 5eb0605..123a0c7 100644
--- a/winsup/cygwin/release/2.3.0
+++ b/winsup/cygwin/release/2.3.0
@@ -56,3 +56,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.
diff --git a/winsup/cygwin/signal.cc b/winsup/cygwin/signal.cc
index 4897417..8dfd4ab 100644
--- a/winsup/cygwin/signal.cc
+++ b/winsup/cygwin/signal.cc
@@ -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
diff --git a/winsup/cygwin/thread.cc b/winsup/cygwin/thread.cc
index d9b6211..ff84590 100644
--- a/winsup/cygwin/thread.cc
+++ b/winsup/cygwin/thread.cc
@@ -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))
{