This is the mail archive of the
cygwin-cvs@cygwin.com
mailing list for the Cygwin project.
[newlib-cygwin] Cygwin: clock_nanosleep is not supposed to crash, return EFAULT instead
- From: Corinna Vinschen <corinna at sourceware dot org>
- To: cygwin-cvs at sourceware dot org
- Date: 11 Jan 2019 14:15:50 -0000
- Subject: [newlib-cygwin] Cygwin: clock_nanosleep is not supposed to crash, return EFAULT instead
https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=9ef0cd6a6c4e748ef40e08c62ad84cf70f37161d
commit 9ef0cd6a6c4e748ef40e08c62ad84cf70f37161d
Author: Corinna Vinschen <corinna@vinschen.de>
Date: Fri Jan 11 15:15:32 2019 +0100
Cygwin: clock_nanosleep is not supposed to crash, return EFAULT instead
...in case rqtp or rmtp specified invalid addresses.
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diff:
---
winsup/cygwin/signal.cc | 26 +++++++++++++++++++++-----
1 file changed, 21 insertions(+), 5 deletions(-)
diff --git a/winsup/cygwin/signal.cc b/winsup/cygwin/signal.cc
index 9e6fdc6..b3e257b 100644
--- a/winsup/cygwin/signal.cc
+++ b/winsup/cygwin/signal.cc
@@ -65,8 +65,16 @@ clock_nanosleep (clockid_t clk_id, int flags, const struct timespec *rqtp,
sig_dispatch_pending ();
pthread_testcancel ();
- if (rqtp->tv_sec < 0 || rqtp->tv_nsec < 0 || rqtp->tv_nsec >= NSPERSEC)
- return EINVAL;
+ __try
+ {
+ if (rqtp->tv_sec < 0 || rqtp->tv_nsec < 0 || rqtp->tv_nsec >= NSPERSEC)
+ return EINVAL;
+ }
+ __except (NO_ERROR)
+ {
+ return EFAULT;
+ }
+ __endtry
/* Explicitly disallowed by POSIX. Needs to be checked first to avoid
being caught by the following test. */
@@ -122,9 +130,17 @@ clock_nanosleep (clockid_t clk_id, int flags, const struct timespec *rqtp,
/* according to POSIX, rmtp is used only if !abstime */
if (rmtp && !abstime)
{
- rmtp->tv_sec = (time_t) (timeout.QuadPart / NS100PERSEC);
- rmtp->tv_nsec = (long) ((timeout.QuadPart % NS100PERSEC)
- * (NSPERSEC/NS100PERSEC));
+ __try
+ {
+ rmtp->tv_sec = (time_t) (timeout.QuadPart / NS100PERSEC);
+ rmtp->tv_nsec = (long) ((timeout.QuadPart % NS100PERSEC)
+ * (NSPERSEC/NS100PERSEC));
+ }
+ __except (NO_ERROR)
+ {
+ res = EFAULT;
+ }
+ __endtry
}
syscall_printf ("%d = clock_nanosleep(%lu, %d, %ld.%09ld, %ld.%09.ld)",