]> granicus.if.org Git - pdns/commitdiff
avoid bindbackend lockup during metadata mismatch. This patch avoids the lockup but...
authorPeter van Dijk <peter.van.dijk@netherlabs.nl>
Fri, 19 Oct 2012 20:27:03 +0000 (20:27 +0000)
committerPeter van Dijk <peter.van.dijk@netherlabs.nl>
Fri, 19 Oct 2012 20:27:03 +0000 (20:27 +0000)
git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@2819 d19b8d6e-7fed-0310-83ef-9ca221ded41b

pdns/backends/bind/bindbackend2.cc

index 5e95595fdfaa13e3b17ef9e9ba2bb9acff191530..e5771e4df2f1577ec9903bf07b7d4e438d652ca4 100644 (file)
@@ -970,6 +970,7 @@ bool Bind2Backend::getBeforeAndAfterNamesAbsolute(uint32_t id, const std::string
   
   }
   else {
+    bool wraponce;
     string lqname = toLower(qname);
     // cerr<<"\nin bind2backend::getBeforeAndAfterAbsolute: nsec3 HASH for "<<auth<<", asked for: "<<lqname<< " (auth: "<<auth<<".)"<<endl;
     typedef recordstorage_t::index<HashedTag>::type records_by_hashindex_t;
@@ -991,11 +992,18 @@ bool Bind2Backend::getBeforeAndAfterNamesAbsolute(uint32_t id, const std::string
       iter = hashindex.end();
     }
 
+    wraponce = false;
     while(iter == hashindex.end() || !(iter->auth) || iter->nsec3hash.empty())
     {
       iter--;
-      if(iter == hashindex.begin())
-        iter = hashindex.end();
+      if(iter == hashindex.begin()) {
+        if (!wraponce) {
+          iter = hashindex.end();
+          wraponce = true;
+        }
+        else
+          break;
+      }
     }
 
     before = iter->nsec3hash;
@@ -1009,12 +1017,17 @@ bool Bind2Backend::getBeforeAndAfterNamesAbsolute(uint32_t id, const std::string
       iter = hashindex.begin();
     }
 
+    wraponce = false;
     while(!(iter->auth) || iter->nsec3hash.empty())
     {
       iter++;
       if(iter == hashindex.end())
       {
         iter = hashindex.begin();
+        if (!wraponce)
+          wraponce = true;
+        else
+          break;
       }
     }