]> granicus.if.org Git - pdns/commitdiff
check if supermaster notifications are unique before queuing
authorbert hubert <bert.hubert@netherlabs.nl>
Wed, 29 Nov 2017 19:26:51 +0000 (20:26 +0100)
committermind04 <mind04@monshouwer.org>
Sat, 31 Mar 2018 21:40:21 +0000 (23:40 +0200)
pdns/communicator.hh
pdns/dnspacket.cc
pdns/dnspacket.hh
pdns/packethandler.cc
pdns/packethandler.hh
pdns/slavecommunicator.cc

index 8d842aa6d8bd657adeebd2d82d784bfba5a1813f..8991d6cc0569210e141750e01f770041a8e0be96 100644 (file)
@@ -208,7 +208,14 @@ private:
   Semaphore d_any_sem;
   time_t d_tickinterval;
   set<DomainInfo> d_tocheck;
-  vector<DNSPacket> d_potentialsupermasters;
+  struct cmp {
+    bool operator()(const DNSPacket& a, const DNSPacket& b) {
+      return a.qdomain < b.qdomain;
+    };
+  };
+
+  std::set<DNSPacket, cmp> d_potentialsupermasters;
+
   set<string> d_alsoNotify;
   NotificationQueue d_nq;
   NetmaskGroup d_onlyNotify;
index f81a21b6cb503b781f5fd0d67ffee03edd411746..33aab01b22e39586d9d7d3afbbc0b4430c9485a7 100644 (file)
@@ -611,7 +611,7 @@ void DNSPacket::setRemote(const ComboAddress *s)
   d_remote=*s;
 }
 
-bool DNSPacket::hasEDNSSubnet()
+bool DNSPacket::hasEDNSSubnet() const
 {
   return d_haveednssubnet;
 }
index a1b1ad7852288f57ee5b25f08aba5e72c678f186..81c1d6664c9acbab373250e6da150eb234dd27a4 100644 (file)
@@ -120,7 +120,7 @@ public:
   void setMaxReplyLen(int bytes); //!< set the max reply len (used when retrieving from the packet cache, and this changed)
 
   bool couldBeCached(); //!< returns 0 if this query should bypass the packet cache
-  bool hasEDNSSubnet();
+  bool hasEDNSSubnet() const;
   bool hasEDNS();
   uint8_t getEDNSVersion() const { return d_ednsversion; };
   void setEDNSRcode(uint16_t extRCode)
index dba5379e5ad4d03aa11eda134c654714361710ab..17f3f0965afda04844945f39f6f428f920a74a44 100644 (file)
@@ -729,7 +729,7 @@ int PacketHandler::trySuperMaster(DNSPacket *p, const DNSName& tsigkeyname)
   }
 }
 
-int PacketHandler::trySuperMasterSynchronous(DNSPacket *p, const DNSName& tsigkeyname)
+int PacketHandler::trySuperMasterSynchronous(const DNSPacket *p, const DNSName& tsigkeyname)
 {
   string remote = p->getRemote().toString();
   if(p->hasEDNSSubnet() && ::arg().contains("trusted-notification-proxy", remote)) {
index e9be90e42a989d66bdc0a44be8a483421e669620..0a38735af6f0612f2e5a9b3f91e941013803c676 100644 (file)
@@ -63,7 +63,7 @@ public:
  
   UeberBackend *getBackend();
 
-  int trySuperMasterSynchronous(DNSPacket *p, const DNSName& tsigkeyname);
+  int trySuperMasterSynchronous(const DNSPacket *p, const DNSName& tsigkeyname);
   static NetmaskGroup s_allowNotifyFrom;
   static set<string> s_forwardNotify;
 
index 3a8f0d95d4891a7176dfd8e290c2edf2c866bff7..5bd485b231d0139c5ca1d2a9695409366c1106bf 100644 (file)
@@ -723,8 +723,8 @@ void CommunicatorClass::addTrySuperMasterRequest(DNSPacket *p)
 {
   Lock l(&d_lock);
   DNSPacket ours = *p;
-  d_potentialsupermasters.push_back(ours);
-  d_any_sem.post(); // kick the loop!
+  if(d_potentialsupermasters.insert(ours).second)
+    d_any_sem.post(); // kick the loop!
 }
 
 void CommunicatorClass::slaveRefresh(PacketHandler *P)
@@ -734,18 +734,18 @@ void CommunicatorClass::slaveRefresh(PacketHandler *P)
 
   UeberBackend *B=P->getBackend();
   vector<DomainInfo> rdomains;
-  vector<DomainNotificationInfo> sdomains; 
-  vector<DNSPacket> trysuperdomains;
-
+  vector<DomainNotificationInfo> sdomains;
+  set<DNSPacket, cmp> trysuperdomains;
   {
     Lock l(&d_lock);
     rdomains.insert(rdomains.end(), d_tocheck.begin(), d_tocheck.end());
     d_tocheck.clear();
-    trysuperdomains.insert(trysuperdomains.end(), d_potentialsupermasters.begin(), d_potentialsupermasters.end());
+
+    trysuperdomains = d_potentialsupermasters;
     d_potentialsupermasters.clear();
   }
 
-  for(DNSPacket& dp :  trysuperdomains) {
+  for(const DNSPacket& dp :  trysuperdomains) {
     // get the TSIG key name
     TSIGRecordContent trc;
     DNSName tsigkeyname;