]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
ALIAS: Return SERVFAIL on error over UDP
authorPieter Lexis <pieter.lexis@powerdns.com>
Wed, 23 May 2018 17:15:10 +0000 (19:15 +0200)
committerPieter Lexis <pieter.lexis@powerdns.com>
Thu, 21 Jun 2018 10:04:12 +0000 (12:04 +0200)
pdns/dnsproxy.cc

index b15a52658fa40f31c36be75c87cad2c33e17c490..69f5b30f6792eb42c0b9de8460d04989211d298e 100644 (file)
@@ -100,7 +100,7 @@ bool DNSProxy::completePacket(DNSPacket *r, const DNSName& target,const DNSName&
       ret2 = stubDoResolve(target, QType::AAAA, ips);
 
     if(ret1 != RCode::NoError || ret2 != RCode::NoError) {
-      g_log<<Logger::Error<<"Error resolving for "<<aname<<" ALIAS "<<target;
+      g_log<<Logger::Error<<"Error resolving for "<<aname<<" ALIAS "<<target<<" over TCP";
       if (ret1 != RCode::NoError) {
        g_log<<Logger::Error<<", A-record query returned "<<RCode::to_s(ret1);
       }
@@ -245,26 +245,31 @@ void DNSProxy::mainloop(void)
         /* Set up iov and msgh structures. */
         memset(&msgh, 0, sizeof(struct msghdr));
         string reply; // needs to be alive at time of sendmsg!
-        if(i->second.complete) {
-
+        if(i->second.complete) { // TODO in the world of non-recursive backends, isn't this always true?
           MOADNSParser mdp(false, p.getString());
           //     cerr<<"Got completion, "<<mdp.d_answers.size()<<" answers, rcode: "<<mdp.d_header.rcode<<endl;
-          for(MOADNSParser::answers_t::const_iterator j=mdp.d_answers.begin(); j!=mdp.d_answers.end(); ++j) {        
-            //     cerr<<"comp: "<<(int)j->first.d_place-1<<" "<<j->first.d_label<<" " << DNSRecordContent::NumberToType(j->first.d_type)<<" "<<j->first.d_content->getZoneRepresentation()<<endl;
-            if(j->first.d_place == DNSResourceRecord::ANSWER || (j->first.d_place == DNSResourceRecord::AUTHORITY && j->first.d_type == QType::SOA)) {
-
-              if(j->first.d_type == i->second.qtype || (i->second.qtype == QType::ANY && (j->first.d_type == QType::A || j->first.d_type == QType::AAAA))) {
-                DNSZoneRecord dzr;
-                dzr.dr.d_name=i->second.aname;
-                dzr.dr.d_type = j->first.d_type;
-                dzr.dr.d_ttl=j->first.d_ttl;
-                dzr.dr.d_place= j->first.d_place;
-                dzr.dr.d_content=j->first.d_content;
-                i->second.complete->addRecord(dzr);
+          if (mdp.d_header.rcode == RCode::NoError) {
+            for(MOADNSParser::answers_t::const_iterator j=mdp.d_answers.begin(); j!=mdp.d_answers.end(); ++j) {        
+              //           cerr<<"comp: "<<(int)j->first.d_place-1<<" "<<j->first.d_label<<" " << DNSRecordContent::NumberToType(j->first.d_type)<<" "<<j->first.d_content->getZoneRepresentation()<<endl;
+              if(j->first.d_place == DNSResourceRecord::ANSWER || (j->first.d_place == DNSResourceRecord::AUTHORITY && j->first.d_type == QType::SOA)) {
+
+                if(j->first.d_type == i->second.qtype || (i->second.qtype == QType::ANY && (j->first.d_type == QType::A || j->first.d_type == QType::AAAA))) {
+                  DNSZoneRecord dzr;
+                  dzr.dr.d_name=i->second.aname;
+                  dzr.dr.d_type = j->first.d_type;
+                  dzr.dr.d_ttl=j->first.d_ttl;
+                  dzr.dr.d_place= j->first.d_place;
+                  dzr.dr.d_content=j->first.d_content;
+                  i->second.complete->addRecord(dzr);
+                }
               }
             }
+            i->second.complete->setRcode(mdp.d_header.rcode);
+          } else {
+            g_log<<Logger::Error<<"Error resolving for "<<i->second.aname<<" ALIAS "<<i->second.qname<<" over UDP, "<<QType(i->second.qtype).getName()<<"-record query returned "<<RCode::to_s(mdp.d_header.rcode)<<", returning SERVFAIL"<<endl;
+            i->second.complete->clearRecords();
+            i->second.complete->setRcode(RCode::ServFail);
           }
-          i->second.complete->setRcode(mdp.d_header.rcode);
           reply=i->second.complete->getString();
           iov.iov_base = (void*)reply.c_str();
           iov.iov_len = reply.length();