From 8edbd7efa7deab7c28d1d83513b4bf9bfa90154d Mon Sep 17 00:00:00 2001 From: Remi Gacogne Date: Tue, 20 Aug 2024 15:14:45 +0200 Subject: [PATCH] dnsdist: Take nanoseconds into account in `DynBlock`'s `until` accessor (cherry picked from commit 23bea0c4486ee30b10d1d00a50244de49b970112) --- pdns/dnsdist-lua-inspection.cc | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) 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); -- 2.47.2