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

modules/lmdbbackend/lmdbbackend.cc

index 30bec70def7355d625c14c4089931ba0b08cddf7..020b8d0ef4e998f83524daa44ae287cad5343f32 100644 (file)
@@ -1186,13 +1186,14 @@ bool LMDBBackend::findDomain(domainid_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;
+    }
   }
 }
 
@@ -1201,11 +1202,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();
@@ -2294,7 +2296,10 @@ void LMDBBackend::setLastCheckTime(domainid_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);
   }
@@ -2342,7 +2347,10 @@ void LMDBBackend::setNotified(domainid_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);
   }