From 9da1695192518c8f2ca7692fa45e4acbdf4dc2b7 Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Mon, 29 Apr 2019 16:00:51 +0200 Subject: compat/timer: fix multiply overflow --- compat/timer.cpp | 34 ++++++++++++++-------------------- compat/timer.hpp | 6 ------ 2 files changed, 14 insertions(+), 26 deletions(-) diff --git a/compat/timer.cpp b/compat/timer.cpp index 4bfc37d9..d8ea242d 100644 --- a/compat/timer.cpp +++ b/compat/timer.cpp @@ -11,11 +11,8 @@ #include "timer.hpp" #include #include - #include -using time_type = Timer::time_type; - Timer::Timer() { start(); @@ -28,19 +25,11 @@ void Timer::start() struct timespec Timer::gettime_() const { - struct timespec ts{}; + struct timespec ts; // NOLINT gettime(&ts); - ts.tv_sec -= state.tv_sec; - ts.tv_nsec -= state.tv_nsec; - return ts; -} - -// nanoseconds - -time_type Timer::elapsed_nsecs() const -{ - struct timespec delta = gettime_(); - return (time_type)delta.tv_sec * 1000000000 + (time_type)delta.tv_nsec; + unsigned long long a = ts.tv_sec, b = state.tv_sec; + unsigned c = ts.tv_nsec, d = state.tv_nsec; + return { (time_t)(a - b), (long)(c - d) }; } // milliseconds @@ -72,17 +61,22 @@ static auto otr_get_clock_frequency() return freq.QuadPart; } -void Timer::gettime(timespec* ts) +void Timer::gettime(timespec* state) { static const unsigned long long freq = otr_get_clock_frequency(); - LARGE_INTEGER d; BOOL ret = QueryPerformanceCounter(&d); assert(ret && "QueryPerformanceCounter failed"); - auto part = (long long)std::roundl((d.QuadPart * 1000000000.L) / freq); - ts->tv_sec = d.QuadPart/freq; - ts->tv_nsec = part % 1000000000; + constexpr int usec = 1000000; + unsigned long long tm = d.QuadPart; + tm *= usec; + tm /= freq; + tm %= usec; + tm *= 1000; + + state->tv_sec = (time_t)((unsigned long long)d.QuadPart/freq); + state->tv_nsec = (long)tm; } #elif defined __MACH__ diff --git a/compat/timer.hpp b/compat/timer.hpp index c107d28d..f7791a1a 100644 --- a/compat/timer.hpp +++ b/compat/timer.hpp @@ -10,19 +10,13 @@ #include "export.hpp" #include "time.hpp" - #include -#include -#include struct OTR_COMPAT_EXPORT Timer final { - using time_type = std::int64_t; - Timer(); void start(); - time_type elapsed_nsecs() const; double elapsed_ms() const; double elapsed_seconds() const; -- cgit v1.2.3