From: Pieter Lexis Date: Wed, 23 May 2018 17:15:10 +0000 (+0200) Subject: ALIAS: Return SERVFAIL on error over UDP X-Git-Tag: dnsdist-1.3.3~69^2~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4bd14d944010375427ce35e20ad858cf73e51b19;p=thirdparty%2Fpdns.git ALIAS: Return SERVFAIL on error over UDP --- diff --git a/pdns/dnsproxy.cc b/pdns/dnsproxy.cc index b15a52658f..69f5b30f67 100644 --- a/pdns/dnsproxy.cc +++ b/pdns/dnsproxy.cc @@ -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<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, "<first.d_place-1<<" "<first.d_label<<" " << DNSRecordContent::NumberToType(j->first.d_type)<<" "<first.d_content->getZoneRepresentation()<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<<" "<first.d_label<<" " << DNSRecordContent::NumberToType(j->first.d_type)<<" "<first.d_content->getZoneRepresentation()<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<second.aname<<" ALIAS "<second.qname<<" over UDP, "<second.qtype).getName()<<"-record query returned "<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();