]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
bindbackend: cleanup findBeforeAndAfterUnhashed()
authorKees Monshouwer <mind04@monshouwer.org>
Wed, 14 Sep 2016 13:10:31 +0000 (15:10 +0200)
committermind04 <mind04@monshouwer.org>
Sun, 23 Oct 2016 18:09:27 +0000 (20:09 +0200)
modules/bindbackend/bindbackend2.cc

index 53c0db16fcc74f029c38d8d116dc023934ad13fc..8d833e65e2242ce2a67227b69eddb4dd6b31ae6b 100644 (file)
@@ -927,55 +927,33 @@ void Bind2Backend::queueReloadAndStore(unsigned int id)
 bool Bind2Backend::findBeforeAndAfterUnhashed(BB2DomainInfo& bbd, const DNSName& qname, DNSName& unhashed, string& before, string& after)
 {
   shared_ptr<const recordstorage_t> records = bbd.d_records.get();
-  recordstorage_t::const_iterator iter = records->upper_bound(qname);
 
-  if (before.empty()){
-    //cout<<"starting before for: '"<<domain<<"'"<<endl;
-    iter = records->upper_bound(qname);
+  // for(const auto& record: *records)
+  //   cerr<<record.qname<<"\t"<<makeHexDump(record.qname.toDNSString())<<endl;
 
-    while(iter == records->end() || (qname.canonCompare(iter->qname)) || (!(iter->auth) && (!(iter->qtype == QType::NS))) || (!(iter->qtype)))
-      iter--;
+  recordstorage_t::const_iterator iterBefore, iterAfter;
 
-    if(iter->qname.empty())
-      before.clear();
-    else { 
+  iterBefore = iterAfter = records->upper_bound(qname.makeLowerCase());
 
-      before=iter->qname.labelReverse().toString(" ",false);
-    }
-  }
-  else {
-    if(qname.empty())
-      before.clear();
-    else {
-      before=qname.labelReverse().toString(" ",false);
-    }
-  }
+  if(iterBefore != records->begin())
+    --iterBefore;
+  while((!iterBefore->auth && iterBefore->qtype != QType::NS) || !iterBefore->qtype)
+    --iterBefore;
+  before=iterBefore->qname.labelReverse().toString(" ",false);
 
-  //cerr<<"Now after"<<endl;
-  iter = records->upper_bound(qname);
-
-  if(iter == records->end()) {
-    //cerr<<"\tFound the end, begin storage: '"<<bbd.d_records->begin()->qname<<"', '"<<bbd.d_name<<"'"<<endl;
-    after.clear(); // this does the right thing (i.e. point to apex, which is sure to have auth records)
+  if(iterAfter == records->end()) {
+    iterAfter = records->begin();
   } else {
-    //cerr<<"\tFound: '"<<(iter->qname)<<"' (nsec3hash='"<<(iter->nsec3hash)<<"')"<<endl;
-    // this iteration is theoretically unnecessary - glue always sorts right behind a delegation
-    // so we will never get here. But let's do it anyway.
-    while((!(iter->auth) && (!(iter->qtype == QType::NS))) || (!(iter->qtype)))
-    {
-      iter++;
-      if(iter == records->end())
-      {
-        after.clear();
+    while((!iterAfter->auth && iterAfter->qtype != QType::NS) || !iterAfter->qtype) {
+      ++iterAfter;
+      if(iterAfter == records->end()) {
+        iterAfter = records->begin();
         break;
       }
     }
-    if(iter != records->end()) {
-      after = (iter)->qname.labelReverse().toString(" ",false);
-    }
   }
+  after = iterAfter->qname.labelReverse().toString(" ",false);
 
-  // cerr<<"Before: '"<<before<<"', after: '"<<after<<"'\n";
   return true;
 }
 
@@ -985,24 +963,25 @@ bool Bind2Backend::getBeforeAndAfterNamesAbsolute(uint32_t id, const std::string
   safeGetBBDomainInfo(id, &bbd);
 
   NSEC3PARAMRecordContent ns3pr;
-  DNSName auth=bbd.d_name;
-    
+
   bool nsec3zone;
   if (d_hybrid) {
     DNSSECKeeper dk;
-    nsec3zone=dk.getNSEC3PARAM(auth, &ns3pr);
+    nsec3zone=dk.getNSEC3PARAM(bbd.d_name, &ns3pr);
   } else
-    nsec3zone=getNSEC3PARAM(auth, &ns3pr);
+    nsec3zone=getNSEC3PARAM(bbd.d_name, &ns3pr);
 
   if(!nsec3zone) {
     DNSName dqname(DNSName(boost::replace_all_copy(qname," ",".")).labelReverse()); // the horror
     return findBeforeAndAfterUnhashed(bbd, dqname, unhashed, before, after);
-  }
-  else {
+  } else {
     auto& hashindex=boost::multi_index::get<NSEC3Tag>(*bbd.d_records.getWRITABLE());
 
+    // for(auto iter = first; iter != hashindex.end(); iter++)
+    //  cerr<<iter->nsec3hash<<endl;
+
     auto first = hashindex.upper_bound("");
-    auto iter = hashindex.upper_bound(toLower(qname));
+    auto iter = hashindex.upper_bound(qname.toStringNoDot());
 
     if (iter == hashindex.end()) {
       --iter;