]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Be more careful when initializing TransientDomainInfo. 16196/head
authorMiod Vallat <miod.vallat@powerdns.com>
Mon, 29 Sep 2025 13:55:49 +0000 (15:55 +0200)
committerMiod Vallat <miod.vallat@powerdns.com>
Mon, 29 Sep 2025 15:20:23 +0000 (17:20 +0200)
Signed-off-by: Miod Vallat <miod.vallat@powerdns.com>
(cherry picked from commit b6276dbf3297665b75cf0e4e342ad257a2f0b0e1)

modules/lmdbbackend/lmdbbackend.cc

index 7bd1b956d4f283d295f5e6ff5d84823cfba3a4ff..7d0d3f79e7ac9acc2326f049da8a5314470904e2 100644 (file)
@@ -1055,13 +1055,14 @@ bool LMDBBackend::findDomain(uint32_t domainid, DomainInfo& info) const
 
 void LMDBBackend::consolidateDomainInfo(DomainInfo& info) const
 {
-  // Update the notified_serial value if we have a cached value in memory.
+  // Update the DomainInfo values if we have cached data in memory.
   if (!d_write_notification_update) {
     auto container = s_transient_domain_info.read_lock();
     TransientDomainInfo tdi;
-    container->get(info.id, tdi);
-    info.notified_serial = tdi.notified_serial;
-    info.last_check = tdi.last_check;
+    if (container->get(info.id, tdi)) {
+      info.notified_serial = tdi.notified_serial;
+      info.last_check = tdi.last_check;
+    }
   }
 }
 
@@ -1070,11 +1071,12 @@ void LMDBBackend::writeDomainInfo(const DomainInfo& info)
   if (!d_write_notification_update) {
     auto container = s_transient_domain_info.write_lock();
     TransientDomainInfo tdi;
-    container->get(info.id, tdi);
-    // Only remove the in-memory value if it has not been modified since the
-    // DomainInfo data was set up.
-    if (tdi.notified_serial == info.notified_serial && tdi.last_check == info.last_check) {
-      container->remove(info.id);
+    if (container->get(info.id, tdi)) {
+      // Only remove the in-memory value if it has not been modified since the
+      // DomainInfo data was set up.
+      if (tdi.notified_serial == info.notified_serial && tdi.last_check == info.last_check) {
+        container->remove(info.id);
+      }
     }
   }
   auto txn = d_tdomains->getRWTransaction();
@@ -1868,7 +1870,10 @@ void LMDBBackend::setLastCheckTime(uint32_t domain_id, time_t last_check)
   if (findDomain(domain_id, info)) {
     auto container = s_transient_domain_info.write_lock();
     TransientDomainInfo tdi;
-    container->get(info.id, tdi);
+    if (!container->get(info.id, tdi)) {
+      // No data yet, initialize from DomainInfo
+      tdi.notified_serial = info.notified_serial;
+    }
     tdi.last_check = last_check;
     container->update(info.id, tdi);
   }
@@ -1916,7 +1921,10 @@ void LMDBBackend::setNotified(uint32_t domain_id, uint32_t serial)
   if (findDomain(domain_id, info)) {
     auto container = s_transient_domain_info.write_lock();
     TransientDomainInfo tdi;
-    container->get(info.id, tdi);
+    if (!container->get(info.id, tdi)) {
+      // No data yet, initialize from DomainInfo
+      tdi.last_check = info.last_check;
+    }
     tdi.notified_serial = serial;
     container->update(info.id, tdi);
   }