diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | lib/nanosleep.c | 14 |
2 files changed, 9 insertions, 11 deletions
@@ -1,5 +1,11 @@ 2011-06-25 Paul Eggert <eggert@cs.ucla.edu> + nanosleep: simplify carrying + * lib/nanosleep.c (nanosleep): Use the requested tv_nsec for the + first call to the underyling nanosleep, not for the last one. + This doesn't fix any bugs, but it simplifies the computation of + the remaining delay. Found while auditing integer overflow issues. + dup2: remove test for existence of fcntl * m4/dup2.m4 (gl_FUNC_DUP2): Use "#ifdef FD_CLOEXEC", not "#if HAVE_FCNTL", in the configure-time test program. diff --git a/lib/nanosleep.c b/lib/nanosleep.c index ab5cc89864..aae2653b72 100644 --- a/lib/nanosleep.c +++ b/lib/nanosleep.c @@ -65,7 +65,7 @@ nanosleep (const struct timespec *requested_delay, const time_t limit = 24 * 24 * 60 * 60; time_t seconds = requested_delay->tv_sec; struct timespec intermediate; - intermediate.tv_nsec = 0; + intermediate.tv_nsec = requested_delay->tv_nsec; while (limit < seconds) { @@ -76,20 +76,12 @@ nanosleep (const struct timespec *requested_delay, if (result) { if (remaining_delay) - { - remaining_delay->tv_sec += seconds; - remaining_delay->tv_nsec += requested_delay->tv_nsec; - if (BILLION <= requested_delay->tv_nsec) - { - remaining_delay->tv_sec++; - remaining_delay->tv_nsec -= BILLION; - } - } + remaining_delay->tv_sec += seconds; return result; } + intermediate.tv_nsec = 0; } intermediate.tv_sec = seconds; - intermediate.tv_nsec = requested_delay->tv_nsec; return nanosleep (&intermediate, remaining_delay); } } |