]> git.ipfire.org Git - thirdparty/pdns.git/blobdiff - pdns/dnsproxy.cc
Merge pull request #7870 from omoerbeek/stubquery-fix-arg
[thirdparty/pdns.git] / pdns / dnsproxy.cc
index b15a52658fa40f31c36be75c87cad2c33e17c490..69e5fd1b56e4f856e44f8e9e8662db7836c31825 100644 (file)
@@ -34,6 +34,7 @@
 #include "dns_random.hh"
 #include "stubresolver.hh"
 #include "arguments.hh"
+#include "threadname.hh"
 
 extern StatBag S;
 
@@ -88,7 +89,7 @@ void DNSProxy::go()
 }
 
 //! look up qname target with r->qtype, plonk it in the answer section of 'r' with name aname
-bool DNSProxy::completePacket(DNSPacket *r, const DNSName& target,const DNSName& aname)
+bool DNSProxy::completePacket(DNSPacket *r, const DNSName& target,const DNSName& aname, const uint8_t scopeMask)
 {
   if(r->d_tcp) {
     vector<DNSZoneRecord> ips;
@@ -100,7 +101,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 UDP, original query came in over TCP";
       if (ret1 != RCode::NoError) {
        g_log<<Logger::Error<<", A-record query returned "<<RCode::to_s(ret1);
       }
@@ -141,6 +142,7 @@ bool DNSProxy::completePacket(DNSPacket *r, const DNSName& target,const DNSName&
     ce.anyLocal = r->d_anyLocal;
     ce.complete = r;
     ce.aname=aname;
+    ce.anameScopeMask = scopeMask;
     d_conntrack[id]=ce;
   }
 
@@ -182,6 +184,7 @@ int DNSProxy::getID_locked()
 
 void DNSProxy::mainloop(void)
 {
+  setThreadName("pdns/dnsproxy");
   try {
     char buffer[1500];
     ssize_t len;
@@ -245,10 +248,9 @@ 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) {
-
-          MOADNSParser mdp(false, p.getString());
-          //     cerr<<"Got completion, "<<mdp.d_answers.size()<<" answers, rcode: "<<mdp.d_header.rcode<<endl;
+        MOADNSParser mdp(false, p.getString());
+        //       cerr<<"Got completion, "<<mdp.d_answers.size()<<" answers, rcode: "<<mdp.d_header.rcode<<endl;
+        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)) {
@@ -265,16 +267,16 @@ void DNSProxy::mainloop(void)
             }
           }
           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();
-          delete i->second.complete;
-          i->second.complete=0;
-        }
-        else {
-          iov.iov_base = buffer;
-          iov.iov_len = len;
+        } 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);
         }
+        reply=i->second.complete->getString();
+        iov.iov_base = (void*)reply.c_str();
+        iov.iov_len = reply.length();
+        delete i->second.complete;
+        i->second.complete=0;
         msgh.msg_iov = &iov;
         msgh.msg_iovlen = 1;
         msgh.msg_name = (struct sockaddr*)&i->second.remote;