]> granicus.if.org Git - pdns/commitdiff
auth: prevent the chopOff() loop in lookup(), for SOA queries
authorKees Monshouwer <mind04@monshouwer.org>
Sat, 6 Jul 2019 20:58:41 +0000 (22:58 +0200)
committermind04 <mind04@monshouwer.org>
Fri, 20 Sep 2019 12:42:27 +0000 (14:42 +0200)
without an id, in bind and lmdb backend.

modules/bindbackend/bindbackend2.cc
modules/lmdbbackend/lmdbbackend.cc

index a213b218421cfdce8869857f8fa347408e77b073..859a8028d2348c8c75fef65999295da61b481fef 100644 (file)
@@ -1066,7 +1066,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)
index 36a533e808a3e39d7eba52bc270c06bbcb2335e5..57ce194d59146a926759695150a57285ee4c4112 100644 (file)
@@ -547,17 +547,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<<endl;
       d_getcursor.reset();
@@ -565,7 +561,6 @@ void LMDBBackend::lookup(const QType &type, const DNSName &qdomain, DNSPacket *p
     }
   }
   else {
-    DomainInfo di;
     if(!d_tdomains->getROTransaction().get(zoneId, di)) {
       // cout<<"Could not find a zone with id "<<zoneId<<endl;
       d_getcursor.reset();