From 91d444c2c54834cedaee34a4b35de8e5be4afce0 Mon Sep 17 00:00:00 2001 From: George Stefan <51751981+George-Stefan@users.noreply.github.com> Date: Mon, 10 Jan 2022 23:18:49 +0200 Subject: [PATCH] [sub-mac] fix `elapsed` time in `GetCslWindowEdges()` (#7299) Do all the calculations on uint32_t to prevent bad wraparound check due to mixing uint32_t with uint64_t. Signed-off-by: George Stefan --- src/core/mac/sub_mac.cpp | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/src/core/mac/sub_mac.cpp b/src/core/mac/sub_mac.cpp index 5f9ddfdaf..aacef704b 100644 --- a/src/core/mac/sub_mac.cpp +++ b/src/core/mac/sub_mac.cpp @@ -1131,20 +1131,13 @@ void SubMac::HandleCslTimer(void) void SubMac::GetCslWindowEdges(uint32_t &ahead, uint32_t &after) { uint32_t semiPeriod = mCslPeriod * kUsPerTenSymbols / 2; - uint64_t curTime = otPlatRadioGetNow(&GetInstance()); - uint64_t elapsed; + uint32_t curTime = static_cast(otPlatRadioGetNow(&GetInstance())); + uint32_t elapsed; uint32_t semiWindow; - if (mCslLastSync.GetValue() > curTime) - { - elapsed = UINT64_MAX - mCslLastSync.GetValue() + curTime; - } - else - { - elapsed = curTime - mCslLastSync.GetValue(); - } + elapsed = curTime - mCslLastSync.GetValue(); - semiWindow = static_cast(elapsed * (Get().GetCslAccuracy() + mCslParentAccuracy) / 1000000); + semiWindow = elapsed * (Get().GetCslAccuracy() + mCslParentAccuracy) / 1000000; semiWindow += mCslParentUncert * kUsPerUncertUnit; ahead = (semiWindow + kCslReceiveTimeAhead > semiPeriod) ? semiPeriod : semiWindow + kCslReceiveTimeAhead;