From 75ca779e4737fbeb7bcca41fe609201320347b71 Mon Sep 17 00:00:00 2001 From: nroskill Date: Thu, 2 Jun 2022 10:10:20 +0800 Subject: [PATCH] [CP] fix ThreadCond time_us overflow --- deps/oblib/src/lib/lock/ob_thread_cond.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/deps/oblib/src/lib/lock/ob_thread_cond.cpp b/deps/oblib/src/lib/lock/ob_thread_cond.cpp index 6d64a5e179..73b61340b4 100644 --- a/deps/oblib/src/lib/lock/ob_thread_cond.cpp +++ b/deps/oblib/src/lib/lock/ob_thread_cond.cpp @@ -11,6 +11,7 @@ */ #include "lib/lock/ob_thread_cond.h" +#include #include "lib/stat/ob_diagnose_info.h" #include "lib/oblog/ob_log.h" @@ -129,11 +130,17 @@ int ObThreadCond::wait_us(const uint64_t time_us) ret = OB_ERR_SYS; COMMON_LOG(WARN, "Fail to get time, ", K(tmp_ret), K(ret)); } else { - uint64_t us = (static_cast(curtime.tv_sec) * static_cast(1000000) + - static_cast(curtime.tv_usec) + time_us); + uint64_t cur_time = static_cast(curtime.tv_sec) * static_cast(1000000) + + static_cast(curtime.tv_usec); + uint64_t us = cur_time + time_us; + if (us < cur_time || us < time_us) { + us = UINT64_MAX; + } - abstime.tv_sec = static_cast(us / static_cast(1000000)); - abstime.tv_nsec = static_cast(us % static_cast(1000000)) * 1000; + abstime.tv_sec = static_cast( + std::min(static_cast(std::numeric_limits::max()), + static_cast(us / 1000000))); + abstime.tv_nsec = static_cast(us % static_cast(1000000)) * 1000; if (OB_UNLIKELY(0 != (tmp_ret = pthread_cond_timedwait(&cond_, &mutex_, &abstime)))) { if (ETIMEDOUT != tmp_ret) { ret = OB_ERR_SYS; -- GitLab