]> granicus.if.org Git - pdns/commitdiff
prevent duplicate slave notications caused by different ipv6 address formatting
authorKees Monshouwer <mind04@monshouwer.org>
Wed, 25 Dec 2013 18:02:08 +0000 (19:02 +0100)
committermind04 <mind04@monshouwer.org>
Wed, 25 Dec 2013 18:02:08 +0000 (19:02 +0100)
pdns/mastercommunicator.cc

index 8135bf955b5626ba80ea60761dbc5dac2a1d3c91..28297177582871070f10617af3e86f14edd83d8d 100644 (file)
 void CommunicatorClass::queueNotifyDomain(const string &domain, DNSBackend *B)
 {
   bool hasQueuedItem=false;
-  set<string> ips;
-  FindNS fns;
-  
+  set<string> nsset, ips;
   DNSResourceRecord rr;
-  set<string> nsset;
+  FindNS fns;
+
   B->lookup(QType(QType::NS),domain);
-  while(B->get(rr)) 
+  while(B->get(rr))
     nsset.insert(rr.content);
-  
+
   for(set<string>::const_iterator j=nsset.begin();j!=nsset.end();++j) {
     vector<string> nsips=fns.lookup(*j, B);
     if(nsips.empty())
       L<<Logger::Warning<<"Unable to queue notification of domain '"<<domain<<"': nameservers do not resolve!"<<endl;
-    for(vector<string>::const_iterator k=nsips.begin();k!=nsips.end();++k)
-      ips.insert(*k);
+    else
+      for(vector<string>::const_iterator k=nsips.begin();k!=nsips.end();++k) {
+        const ComboAddress caIp(*k, 53);
+        if(!d_preventSelfNotification || !AddressIsUs(caIp))
+          ips.insert(caIp.toStringWithPort());
+      }
   }
-  
-  // make calls to d_nq.add(domain, ip);
+
   for(set<string>::const_iterator j=ips.begin();j!=ips.end();++j) {
     L<<Logger::Warning<<"Queued notification of domain '"<<domain<<"' to "<<*j<<endl;
     d_nq.add(domain,*j);
     hasQueuedItem=true;
   }
+
   set<string>alsoNotify;
   B->alsoNotifies(domain, &alsoNotify);
-  
+
   for(set<string>::const_iterator j=alsoNotify.begin();j!=alsoNotify.end();++j) {
-    L<<Logger::Warning<<"Queued also-notification of domain '"<<domain<<"' to "<<*j<<endl;
-    d_nq.add(domain,*j);
+    const ComboAddress caIp(*j, 53);
+    L<<Logger::Warning<<"Queued also-notification of domain '"<<domain<<"' to "<<caIp.toStringWithPort()<<endl;
+    if (!ips.count(caIp.toStringWithPort()))
+      d_nq.add(domain, caIp.toStringWithPort());
     hasQueuedItem=true;
   }
+
   if (!hasQueuedItem)
     L<<Logger::Warning<<"Request to queue notification for domain '"<<domain<<"' was processed, but no nameservers or ALSO-NOTIFYs found. Not notifying!"<<endl;
-
 }
 
+
 bool CommunicatorClass::notifyDomain(const string &domain)
 {
   DomainInfo di;