From: Peter van Dijk Date: Fri, 19 Oct 2012 20:27:03 +0000 (+0000) Subject: avoid bindbackend lockup during metadata mismatch. This patch avoids the lockup but... X-Git-Tag: auth-3.2-rc1~63 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7c85a8913981470f0c8344b6d997fd05ead3ef18;p=thirdparty%2Fpdns.git avoid bindbackend lockup during metadata mismatch. This patch avoids the lockup but does not actually return correct data in that situation. FIXME. Patch by Kees Monshouwer git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@2819 d19b8d6e-7fed-0310-83ef-9ca221ded41b --- diff --git a/pdns/backends/bind/bindbackend2.cc b/pdns/backends/bind/bindbackend2.cc index 5e95595fdf..e5771e4df2 100644 --- a/pdns/backends/bind/bindbackend2.cc +++ b/pdns/backends/bind/bindbackend2.cc @@ -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 "<::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; } }