From c4c53bb2f7c0a05e9795da46ea3ddc17b2ef0c78 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sat, 25 Jun 2011 11:55:20 -0700 Subject: [PATCH] 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. --- ChangeLog | 6 ++++++ lib/nanosleep.c | 14 +++----------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index 14d3b0bdf..8e39acf2c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2011-06-25 Paul Eggert + 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 ab5cc8986..aae2653b7 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); } } -- 2.11.0