Piotr Caban : msvcp120: Fix _Xtime_diff_to_millis2 overflow behavior.
Alexandre Julliard
julliard at winehq.org
Tue Oct 17 15:12:10 CDT 2017
Module: wine
Branch: master
Commit: 1d35db9f570490b664f97d3b7e5152be4f07fcb3
URL: http://source.winehq.org/git/wine.git/?a=commit;h=1d35db9f570490b664f97d3b7e5152be4f07fcb3
Author: Piotr Caban <piotr at codeweavers.com>
Date: Tue Oct 17 17:08:15 2017 +0200
msvcp120: Fix _Xtime_diff_to_millis2 overflow behavior.
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/msvcp90/misc.c | 19 ++++++++++++++-----
1 file changed, 14 insertions(+), 5 deletions(-)
diff --git a/dlls/msvcp90/misc.c b/dlls/msvcp90/misc.c
index 1dcc590..9f26a48 100644
--- a/dlls/msvcp90/misc.c
+++ b/dlls/msvcp90/misc.c
@@ -362,6 +362,7 @@ void __thiscall _Container_base12__Swap_all(
#define TICKS_1601_TO_1970 (SECS_1601_TO_1970 * TICKSPERSEC)
#define NANOSEC_PER_MILLISEC 1000000
#define MILLISEC_PER_SEC 1000
+#define NANOSEC_PER_SEC (NANOSEC_PER_MILLISEC * MILLISEC_PER_SEC)
typedef int MSVCRT_long;
@@ -401,16 +402,24 @@ int __cdecl xtime_get(xtime* t, int unknown)
/* _Xtime_diff_to_millis2 */
MSVCRT_long __cdecl _Xtime_diff_to_millis2(const xtime *t1, const xtime *t2)
{
- __time64_t diff_sec;
- MSVCRT_long diff_nsec, ret;
+ LONGLONG diff_sec, diff_nsec;
TRACE("(%p, %p)\n", t1, t2);
diff_sec = t1->sec - t2->sec;
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;
+
+ 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;
}
/* _Xtime_diff_to_millis */
More information about the wine-cvs
mailing list