]> granicus.if.org Git - pdns/commitdiff
auth: load serial in slaveRefresh()
authorKees Monshouwer <mind04@monshouwer.org>
Fri, 30 Nov 2018 07:14:42 +0000 (08:14 +0100)
committermind04 <mind04@monshouwer.org>
Fri, 30 Nov 2018 13:39:59 +0000 (14:39 +0100)
pdns/slavecommunicator.cc

index 27d6e05427b40444b62b80ce235320ee1ae3c118..138441a9cbc73cee012fec607fa3d5badc3fe6a9 100644 (file)
@@ -923,13 +923,20 @@ void CommunicatorClass::slaveRefresh(PacketHandler *P)
         d_failedSlaveRefresh.erase(di.zone);
     }
 
-    uint32_t theirserial = ssr.d_freshness[di.id].theirSerial, ourserial = di.serial;
+    bool hasSOA = false;
+    SOAData sd;
+    try{
+      hasSOA = B->getSOA(di.zone, sd);
+    }
+    catch(...) {}
+
+    uint32_t theirserial = ssr.d_freshness[di.id].theirSerial, ourserial = sd.serial;
 
     if(rfc1982LessThan(theirserial, ourserial) && ourserial != 0 && !::arg().mustDo("axfr-lower-serial"))  {
       g_log<<Logger::Error<<"Domain '"<<di.zone<<"' more recent than master, our serial " << ourserial << " > their serial "<< theirserial << endl;
       di.backend->setFresh(di.id);
     }
-    else if(theirserial == ourserial) {
+    else if(hasSOA && theirserial == ourserial) {
       uint32_t maxExpire=0, maxInception=0;
       if(dk.isPresigned(di.zone)) {
         B->lookup(QType(QType::RRSIG), di.zone); // can't use DK before we are done with this lookup!
@@ -968,7 +975,12 @@ void CommunicatorClass::slaveRefresh(PacketHandler *P)
       }
     }
     else {
-      g_log<<Logger::Warning<<"Domain '"<< di.zone<<"' is stale, master serial "<<theirserial<<", our serial "<< ourserial <<endl;
+      if(hasSOA) {
+        g_log<<Logger::Warning<<"Domain '"<< di.zone<<"' is stale, master serial "<<theirserial<<", our serial "<< ourserial <<endl;
+      }
+      else {
+        g_log<<Logger::Warning<<"Domain '"<< di.zone<<"' is empty, master serial "<<theirserial<<endl;
+      }
       addSuckRequest(di.zone, *di.masters.begin());
     }
   }