diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2019-01-11 15:15:32 +0100 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2019-01-11 15:15:32 +0100 |
commit | 9ef0cd6a6c4e748ef40e08c62ad84cf70f37161d (patch) | |
tree | 15226c4901c61a7f5e37aad39926fede3a57c74b /winsup/cygwin/signal.cc | |
parent | 8d1d8fc914725a88c3463895b36daa353ebd0d26 (diff) | |
download | newlib-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.cc | 26 |
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)", |