From: Remi Gacogne Date: Tue, 20 Aug 2024 13:14:45 +0000 (+0200) Subject: dnsdist: Take nanoseconds into account in `DynBlock`'s `until` accessor X-Git-Tag: dnsdist-1.9.7~10^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F14643%2Fhead;p=thirdparty%2Fpdns.git dnsdist: Take nanoseconds into account in `DynBlock`'s `until` accessor (cherry picked from commit 23bea0c4486ee30b10d1d00a50244de49b970112) --- diff --git a/pdns/dnsdist-lua-inspection.cc b/pdns/dnsdist-lua-inspection.cc index 05b37978aa..5b62616323 100644 --- a/pdns/dnsdist-lua-inspection.cc +++ b/pdns/dnsdist-lua-inspection.cc @@ -962,7 +962,21 @@ void setupLuaInspection(LuaContext& luaCtx) gettime(&nowMonotonic); timespec nowRealTime{}; gettime(&nowRealTime, true); - nowRealTime.tv_sec += (block.until.tv_sec - nowMonotonic.tv_sec); + + auto seconds = block.until.tv_sec - nowMonotonic.tv_sec; + auto nseconds = block.until.tv_nsec - nowMonotonic.tv_nsec; + if (nseconds < 0) { + seconds -= 1; + nseconds += 1000000000; + } + + nowRealTime.tv_sec += seconds; + nowRealTime.tv_nsec += nseconds; + if (nowRealTime.tv_nsec > 1000000000) { + nowRealTime.tv_sec += 1; + nowRealTime.tv_nsec -= 1000000000; + } + return nowRealTime; }, [](DynBlock& block, [[maybe_unused]] timespec until) {}); luaCtx.registerMember("blocks", [](const DynBlock& block) { return block.blocks.load(); }, [](DynBlock& block, [[maybe_unused]] unsigned int blocks) { }); luaCtx.registerMember("action", &DynBlock::action);