From a5036591e2361a5a64d196c0079907a96f16b70e Mon Sep 17 00:00:00 2001 From: Kees Monshouwer Date: Sat, 6 Jul 2019 22:58:41 +0200 Subject: [PATCH] auth: prevent the chopOff() loop in lookup(), for SOA queries without an id, in bind and lmdb backend. --- modules/bindbackend/bindbackend2.cc | 2 +- modules/lmdbbackend/lmdbbackend.cc | 13 ++++--------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/modules/bindbackend/bindbackend2.cc b/modules/bindbackend/bindbackend2.cc index cc89bff38..80507fb58 100644 --- a/modules/bindbackend/bindbackend2.cc +++ b/modules/bindbackend/bindbackend2.cc @@ -1055,7 +1055,7 @@ void Bind2Backend::lookup(const QType &qtype, const DNSName &qname, DNSPacket *p do { found = safeGetBBDomainInfo(domain, &bbd); - } while ((!found || (zoneId != (int)bbd.d_id && zoneId != -1)) && domain.chopOff()); + } while ((!found || (zoneId != (int)bbd.d_id && zoneId != -1)) && qtype != QType::SOA && domain.chopOff()); if(!found) { if(mustlog) diff --git a/modules/lmdbbackend/lmdbbackend.cc b/modules/lmdbbackend/lmdbbackend.cc index e78744a93..9b4c83817 100644 --- a/modules/lmdbbackend/lmdbbackend.cc +++ b/modules/lmdbbackend/lmdbbackend.cc @@ -535,17 +535,13 @@ void LMDBBackend::lookup(const QType &type, const DNSName &qdomain, DNSPacket *p d_dtime.set(); } DNSName hunt(qdomain); + DomainInfo di; if(zoneId < 0) { auto rotxn = d_tdomains->getROTransaction(); - for(;;) { - DomainInfo di; - if((zoneId = rotxn.get<0>(hunt, di))) { - break; - } - if(!hunt.chopOff()) - break; - } + do { + zoneId = rotxn.get<0>(hunt, di); + } while (!zoneId && type != QType::SOA && hunt.chopOff()); if(zoneId <= 0) { // cout << "Did not find zone for "<< qdomain<getROTransaction().get(zoneId, di)) { // cout<<"Could not find a zone with id "<