[newlib-cygwin] Cygwin: clock_nanosleep is not supposed to crash, return EFAULT instead

Corinna Vinschen corinna@sourceware.org
Fri Jan 11 14:15:00 GMT 2019


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)",



More information about the Cygwin-cvs mailing list