Commit a4f4fc50 authored by PHO's avatar PHO Committed by Max Kellermann

Avoid integer overflow in MonotonicClock{S,MS,US}

This is Darwin specific: the previous implementation was causing an integer overflow when base.numer is very large. On PPC Darwin, the timebase info is 1000000000/33330116 and this is too large for integer arithmetic.
parent ad1b6ef0
ver 0.18.23 (not yet released) ver 0.18.23 (not yet released)
* despotify: remove defunct plugin * despotify: remove defunct plugin
* fix clock integer overflow on OS X
* fix gcc 5.0 warnings * fix gcc 5.0 warnings
ver 0.18.22 (2014/01/14) ver 0.18.22 (2014/01/14)
......
...@@ -40,8 +40,8 @@ MonotonicClockMS(void) ...@@ -40,8 +40,8 @@ MonotonicClockMS(void)
if (base.denom == 0) if (base.denom == 0)
(void)mach_timebase_info(&base); (void)mach_timebase_info(&base);
return (unsigned)((mach_absolute_time() * base.numer) return (unsigned)(((double)mach_absolute_time() * base.numer)
/ (1000000 * base.denom)); / base.denom / 1000000);
#elif defined(CLOCK_MONOTONIC) #elif defined(CLOCK_MONOTONIC)
struct timespec ts; struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts); clock_gettime(CLOCK_MONOTONIC, &ts);
...@@ -82,8 +82,8 @@ MonotonicClockUS(void) ...@@ -82,8 +82,8 @@ MonotonicClockUS(void)
if (base.denom == 0) if (base.denom == 0)
(void)mach_timebase_info(&base); (void)mach_timebase_info(&base);
return ((uint64_t)mach_absolute_time() * (uint64_t)base.numer) return (uint64_t)(((double)mach_absolute_time() * base.numer)
/ (1000 * (uint64_t)base.denom); / base.denom / 1000);
#elif defined(CLOCK_MONOTONIC) #elif defined(CLOCK_MONOTONIC)
struct timespec ts; struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts); clock_gettime(CLOCK_MONOTONIC, &ts);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment