]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Take nanoseconds into account in `DynBlock`'s `until` accessor 14643/head
authorRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 20 Aug 2024 13:14:45 +0000 (15:14 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Mon, 9 Sep 2024 14:08:07 +0000 (16:08 +0200)
(cherry picked from commit 23bea0c4486ee30b10d1d00a50244de49b970112)

pdns/dnsdist-lua-inspection.cc

index 05b37978aa010c3e2af9bd3ac726c597c9da1a37..5b62616323c2fcd269122336829f9117150fb937 100644 (file)
@@ -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<DynBlock, unsigned int>("blocks", [](const DynBlock& block) { return block.blocks.load(); }, [](DynBlock& block, [[maybe_unused]] unsigned int blocks) { });
   luaCtx.registerMember("action", &DynBlock::action);