aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2019-01-18 14:31:01 +0100
committerCorinna Vinschen <corinna@vinschen.de>2019-01-18 14:31:01 +0100
commit397526dee858e4b43b0e4ecca470a1df92f09d5d (patch)
treea661f1492ae571bca712ab014bd654a2f419d54a
parent7f983079d4a62e3f906a97bf091908a1dad29bb6 (diff)
downloadnewlib-397526dee858e4b43b0e4ecca470a1df92f09d5d.zip
newlib-397526dee858e4b43b0e4ecca470a1df92f09d5d.tar.gz
newlib-397526dee858e4b43b0e4ecca470a1df92f09d5d.tar.bz2
Cygwin: clock.h: add valid_timespec() to check timespec for validity
Use throughout, drop local timespec_bad() in timer.cc. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
-rw-r--r--winsup/cygwin/aio.cc2
-rw-r--r--winsup/cygwin/clock.h8
-rw-r--r--winsup/cygwin/posix_ipc.cc4
-rw-r--r--winsup/cygwin/signal.cc5
-rw-r--r--winsup/cygwin/thread.cc4
-rw-r--r--winsup/cygwin/timer.cc19
6 files changed, 19 insertions, 23 deletions
diff --git a/winsup/cygwin/aio.cc b/winsup/cygwin/aio.cc
index b245bdd..f38ea4d 100644
--- a/winsup/cygwin/aio.cc
+++ b/winsup/cygwin/aio.cc
@@ -766,7 +766,7 @@ aiosuspend (const struct aiocb *const aiolist[],
if (timeout)
{
to = *timeout;
- if (to.tv_sec < 0 || to.tv_nsec < 0 || to.tv_nsec > NSPERSEC)
+ if (!valid_timespec (to))
{
set_errno (EINVAL);
return -1;
diff --git a/winsup/cygwin/clock.h b/winsup/cygwin/clock.h
index c05bf47..538b4b2 100644
--- a/winsup/cygwin/clock.h
+++ b/winsup/cygwin/clock.h
@@ -166,4 +166,12 @@ ts_diff (const struct timespec &ts0, struct timespec &ts1)
ts1.tv_sec -= ts0.tv_sec;
}
+static inline bool
+valid_timespec (const timespec& ts)
+{
+ if (ts.tv_nsec < 0 || ts.tv_nsec >= NSPERSEC || ts.tv_sec < 0)
+ return false;
+ return true;
+}
+
#endif /*__CLOCK_H__*/
diff --git a/winsup/cygwin/posix_ipc.cc b/winsup/cygwin/posix_ipc.cc
index 36e9ed9..86734c9 100644
--- a/winsup/cygwin/posix_ipc.cc
+++ b/winsup/cygwin/posix_ipc.cc
@@ -181,9 +181,7 @@ ipc_cond_timedwait (HANDLE evt, HANDLE mtx, const struct timespec *abstime)
++cnt;
if (abstime)
{
- if (abstime->tv_sec < 0
- || abstime->tv_nsec < 0
- || abstime->tv_nsec >= NSPERSEC)
+ if (!valid_timespec (*abstime))
return EINVAL;
/* If a timeout is set, we create a waitable timer to wait for.
diff --git a/winsup/cygwin/signal.cc b/winsup/cygwin/signal.cc
index 5759cc4..fdde260 100644
--- a/winsup/cygwin/signal.cc
+++ b/winsup/cygwin/signal.cc
@@ -69,7 +69,7 @@ clock_nanosleep (clockid_t clk_id, int flags, const struct timespec *rqtp,
__try
{
- if (rqtp->tv_sec < 0 || rqtp->tv_nsec < 0 || rqtp->tv_nsec >= NSPERSEC)
+ if (!valid_timespec (*rqtp))
return EINVAL;
}
__except (NO_ERROR)
@@ -654,8 +654,7 @@ sigtimedwait (const sigset_t *set, siginfo_t *info, const timespec *timeout)
if (timeout)
{
- if (timeout->tv_sec < 0
- || timeout->tv_nsec < 0 || timeout->tv_nsec > NSPERSEC)
+ if (!valid_timespec (*timeout))
{
set_errno (EINVAL);
return -1;
diff --git a/winsup/cygwin/thread.cc b/winsup/cygwin/thread.cc
index f0f7b0a..c7b7e51 100644
--- a/winsup/cygwin/thread.cc
+++ b/winsup/cygwin/thread.cc
@@ -2549,9 +2549,7 @@ pthread_convert_abstime (clockid_t clock_id, const struct timespec *abstime,
struct timespec tp;
/* According to SUSv3, the abstime value must be checked for validity. */
- if (abstime->tv_sec < 0
- || abstime->tv_nsec < 0
- || abstime->tv_nsec >= NSPERSEC)
+ if (!valid_timespec (*abstime))
return EINVAL;
/* Check for immediate timeout before converting */
diff --git a/winsup/cygwin/timer.cc b/winsup/cygwin/timer.cc
index c972745..e817dab 100644
--- a/winsup/cygwin/timer.cc
+++ b/winsup/cygwin/timer.cc
@@ -342,17 +342,6 @@ timer_thread (VOID *x)
return tt->thread_func ();
}
-static inline bool
-timespec_bad (const timespec& t)
-{
- if (t.tv_nsec < 0 || t.tv_nsec >= NSPERSEC || t.tv_sec < 0)
- {
- set_errno (EINVAL);
- return true;
- }
- return false;
-}
-
int
timer_tracker::settime (int in_flags, const itimerspec *value, itimerspec *ovalue)
{
@@ -366,8 +355,12 @@ timer_tracker::settime (int in_flags, const itimerspec *value, itimerspec *ovalu
__leave;
}
- if (timespec_bad (value->it_value) || timespec_bad (value->it_interval))
- __leave;
+ if (!valid_timespec (value->it_value)
+ || !valid_timespec (value->it_interval))
+ {
+ set_errno (EINVAL);
+ __leave;
+ }
lock_timer_tracker here;
cancel ();