aboutsummaryrefslogtreecommitdiff
path: root/winsup/cygwin/signal.cc
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2019-01-11 15:15:32 +0100
committerCorinna Vinschen <corinna@vinschen.de>2019-01-11 15:15:32 +0100
commit9ef0cd6a6c4e748ef40e08c62ad84cf70f37161d (patch)
tree15226c4901c61a7f5e37aad39926fede3a57c74b /winsup/cygwin/signal.cc
parent8d1d8fc914725a88c3463895b36daa353ebd0d26 (diff)
downloadnewlib-9ef0cd6a6c4e748ef40e08c62ad84cf70f37161d.zip
newlib-9ef0cd6a6c4e748ef40e08c62ad84cf70f37161d.tar.gz
newlib-9ef0cd6a6c4e748ef40e08c62ad84cf70f37161d.tar.bz2
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>
Diffstat (limited to 'winsup/cygwin/signal.cc')
-rw-r--r--winsup/cygwin/signal.cc26
1 files 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)",