On 10/11/17 17:07, Stefan Dösinger wrote:
+ {0x7FFFFFFFFFFFFFFF, 0, 0x7FFFFFFFFFFFFFFD, 0, 0}, /* Not an overflow */ Defining LONGLONG constants this way is not portable.
@@ -410,7 +410,13 @@ MSVCRT_long __cdecl _Xtime_diff_to_millis2(const xtime *t1, const xtime *t2) diff_nsec = t1->nsec - t2->nsec; ret = diff_sec * MILLISEC_PER_SEC + (diff_nsec + NANOSEC_PER_MILLISEC - 1) / NANOSEC_PER_MILLISEC; - return ret > 0 ? ret : 0; + + /* This function does not return negative numbers, except when they get created through + * an integer overflow. */ + if (diff_sec > ((LONGLONG)INT_MAX + NANOSEC_PER_MILLISEC - 1) / NANOSEC_PER_MILLISEC) + return ret; + else + return ret > 0 ? ret : 0; } It looks like the function should be treating negative time differences in special way. Except of that it seems to be ignoring overflows. I think that following code is much easier to read. Is something like this working for you? MSVCRT_long __cdecl _Xtime_diff_to_millis2(const xtime *t1, const xtime *t2) { LONGLONG diff_sec, diff_nsec;
TRACE("(%p, %p)\n", t1, t2); diff_sec = t1->sec - t2->sec; diff_nsec = t1->nsec - t2->nsec; diff_sec += diff_nsec / NANOSEC_PER_SEC; diff_nsec %= NANOSEC_PER_SEC; if (diff_nsec < 0) { diff_sec -= 1; diff_nsec += NANOSEC_PER_SEC; } if (diff_sec<0 || (diff_sec==0 && diff_nsec<0)) return 0; return diff_sec * MILLISEC_PER_SEC + (diff_nsec + NANOSEC_PER_MILLISEC - 1) / NANOSEC_PER_MILLISEC; } Thanks, Piotr