Paul Eggert wrote: > * lib/nanosleep.c (my_usleep): Don't assume signed integer > arithmetic wraps around on overflow. > --- > ChangeLog | 4 ++++ > lib/nanosleep.c | 5 ++--- > 2 files changed, 6 insertions(+), 3 deletions(-) > > diff --git a/ChangeLog b/ChangeLog > index 8e39acf..8466258 100644 > --- a/ChangeLog > +++ b/ChangeLog > @@ -1,5 +1,9 @@ > 2011-06-25 Paul Eggert <egg...@cs.ucla.edu> > > + nanosleep: fix integer overflow problem > + * lib/nanosleep.c (my_usleep): Don't assume signed integer > + arithmetic wraps around on overflow. > + > 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. > diff --git a/lib/nanosleep.c b/lib/nanosleep.c > index aae2653..e08c002 100644 > --- a/lib/nanosleep.c > +++ b/lib/nanosleep.c > @@ -210,12 +210,11 @@ my_usleep (const struct timespec *ts_delay) > tv_delay.tv_usec = (ts_delay->tv_nsec + 999) / 1000; > if (tv_delay.tv_usec == 1000000) > { > - time_t t1 = tv_delay.tv_sec + 1; > - if (t1 < tv_delay.tv_sec) > + if (tv_delay.tv_sec == TYPE_MAXIMUM (time_t)) > tv_delay.tv_usec = 1000000 - 1; /* close enough */ > else > { > - tv_delay.tv_sec = t1; > + tv_delay.tv_sec++; > tv_delay.tv_usec = 0;
Good one. Thanks!