From fd8bc9930b6fa42e16ca1d1612295a21000dde27 Mon Sep 17 00:00:00 2001 From: Bert Hubert Date: Wed, 12 Mar 2003 16:06:35 +0000 Subject: [PATCH] fixes for nic.fr git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@159 d19b8d6e-7fed-0310-83ef-9ca221ded41b --- pdns/common_startup.cc | 3 +- pdns/dnspacket.cc | 8 +++-- pdns/docs/pdns.sgml | 19 ++++++++--- pdns/packethandler.cc | 73 ++++++++++++++++++++++++------------------ pdns/packethandler.hh | 4 +-- pdns/syncres.cc | 48 ++++++++++++++++++++------- pdns/tcpreceiver.cc | 1 + 7 files changed, 102 insertions(+), 54 deletions(-) diff --git a/pdns/common_startup.cc b/pdns/common_startup.cc index 4e37b6e38..31bfc0914 100644 --- a/pdns/common_startup.cc +++ b/pdns/common_startup.cc @@ -91,6 +91,7 @@ void declareArguments() arg().set("webserver-password","Password required for accessing the webserver")=""; arg().setSwitch("out-of-zone-additional-processing","Do out of zone additional processing")="no"; + arg().setSwitch("do-ipv6-additional-processing", "Do AAAA additional processing")="no"; arg().setSwitch("query-logging","Hint backends that queries should be logged")="no"; arg().set("cache-ttl","Seconds to store packets in the PacketCache")="20"; @@ -162,7 +163,7 @@ void sendout(const DNSDistributor::AnswerData &AD) N->send(AD.A); numanswered++; int diff=AD.A->d_dt.udiff(); - avg_latency=(int)(0.999*avg_latency+0.001*diff); + avg_latency=(int)(1023*avg_latency/1024+diff/1024); delete AD.A; diff --git a/pdns/dnspacket.cc b/pdns/dnspacket.cc index 36b802515..668cdf596 100644 --- a/pdns/dnspacket.cc +++ b/pdns/dnspacket.cc @@ -16,7 +16,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -// $Id: dnspacket.cc,v 1.17 2003/02/25 12:36:49 ahu Exp $ +// $Id: dnspacket.cc,v 1.18 2003/03/12 16:06:35 ahu Exp $ #include "utility.hh" #include @@ -1191,10 +1191,12 @@ vector DNSPacket::getAnswers() rr.ttl=answerp[offset+7]+256*(answerp[offset+6]+256*(answerp[offset+5]+256*answerp[offset+4])); rr.content=""; length=256*(unsigned char)answerp[offset+8]+(unsigned char)answerp[offset+8+1]; - // was: ntohs(*(u_int16_t*)(answerp+offset+8)); - // XXX check if this 'length' extends beyond the end of the packet! const unsigned char *datapos=answerp+offset+10; + + if(datapos+length > end) + throw AhuException("Record extends beyond end of packet"); + string part; offset=0; diff --git a/pdns/docs/pdns.sgml b/pdns/docs/pdns.sgml index 0655fdeae..32f6e7245 100644 --- a/pdns/docs/pdns.sgml +++ b/pdns/docs/pdns.sgml @@ -11,7 +11,7 @@ - v2.1 $Date: 2003/03/04 18:33:39 $ + v2.1 $Date: 2003/03/12 16:06:35 $ @@ -4624,6 +4624,10 @@ Feb 10 14:16:03 stats: 125784 questions, 13971 cache entries, 309 negative entri Maximum number of miliseconds to queue a query. See . + query-local-address=... + + The IP address to use as a source address for sending queries. Useful if you have multiple IPs and pdns is not bound to the IP address your operating system uses by default for outgoing packets. + query-logging | query-logging=yes | query-logging=no Hints to a backend that it should log a textual representation of queries it performs. Can be set at runtime. @@ -5201,6 +5205,14 @@ Feb 10 14:16:03 stats: 125784 questions, 13971 cache entries, 309 negative entri + + Q: My masters won't allow PowerDNS to access zones as it is using the wrong local IP address + + + A: Mark Bergsma contributed the query-local-address setting to tell PowerDNS which local IP address to use. + + + Q: Can I use a MySQL database with the Windows version of PowerDNS? @@ -5443,11 +5455,10 @@ Feb 10 14:16:03 stats: 125784 questions, 13971 cache entries, 309 negative entri - Q: Will PowerDNS Express be open sourced? - PowerMail? + Q: Will PowerDNS Express be open sourced? - Perhaps, we're not yet sure. PowerMail most probably. + Perhaps, we're not yet sure. diff --git a/pdns/packethandler.cc b/pdns/packethandler.cc index 8302cb60f..d96c7046e 100644 --- a/pdns/packethandler.cc +++ b/pdns/packethandler.cc @@ -50,6 +50,7 @@ PacketHandler::PacketHandler():B(s_programname) d_doCNAME = (arg()["skip-cname"]=="no"); d_doRecursion= arg().mustDo("recursor"); d_logDNSDetails= arg().mustDo("log-dns-details"); + d_doIPv6AdditionalProcessing = arg().mustDo("do-ipv6-additional-processing"); } DNSBackend *PacketHandler::getBackend() @@ -153,7 +154,7 @@ int PacketHandler::doDNSCheckRequest(DNSPacket *p, DNSPacket *r, string &target) DNSResourceRecord rr; if (p->qclass == 3 && p->qtype.getName() == "HINFO") { - rr.content = "PowerDNS $Id: packethandler.cc,v 1.10 2003/02/25 12:36:49 ahu Exp $"; + rr.content = "PowerDNS $Id: packethandler.cc,v 1.11 2003/03/12 16:06:35 ahu Exp $"; rr.ttl = 5; rr.qname=target; rr.qtype=13; // hinfo @@ -169,7 +170,7 @@ int PacketHandler::doVersionRequest(DNSPacket *p, DNSPacket *r, string &target) { DNSResourceRecord rr; if(p->qtype.getCode()==QType::TXT && target=="version.bind") {// TXT - rr.content="Served by POWERDNS "VERSION" $Id: packethandler.cc,v 1.10 2003/02/25 12:36:49 ahu Exp $"; + rr.content="Served by POWERDNS "VERSION" $Id: packethandler.cc,v 1.11 2003/03/12 16:06:35 ahu Exp $"; rr.ttl=5; rr.qname=target; rr.qtype=QType::TXT; // TXT @@ -294,47 +295,55 @@ int PacketHandler::doWildcardRecords(DNSPacket *p, DNSPacket *r, string &target) } /** dangling is declared true if we were unable to resolve everything */ -int PacketHandler::doAdditionalProcessing(DNSPacket *p, DNSPacket *r) +int PacketHandler::doAdditionalProcessingAndDropAA(DNSPacket *p, DNSPacket *r) { DNSResourceRecord rr; + SOAData sd; if(p->qtype.getCode()!=QType::AXFR && r->needAP()) { // this packet needs additional processing DLOG(L< arrs=r->getAPRecords(); - for(vector::const_iterator i=arrs.begin(); i!=arrs.end(); ++i) { - B.lookup("A",i->content,p); - bool foundOne=false; - while(B.get(rr)) { - foundOne=true; - if(rr.domain_id!=i->domain_id && arg()["out-of-zone-additional-processing"]=="no") { - DLOG(L<qname<<" ("<d.aa && i->qtype.getCode()==QType::NS && !B.getSOA(i->qname,sd)) // drop AA in case of non-SOA-level NS answer + r->d.aa=false; + + QType qtypes[2]; + qtypes[0]="A"; qtypes[1]="AAAA"; + for(int n=0;n < d_doIPv6AdditionalProcessing + 1; ++n) { + B.lookup(qtypes[n],i->content,p); + bool foundOne=false; + while(B.get(rr)) { + foundOne=true; + if(rr.domain_id!=i->domain_id && arg()["out-of-zone-additional-processing"]=="no") { + DLOG(L<qname<<" ("<addRecord(rr); + } - - rr.d_place=DNSResourceRecord::ADDITIONAL; - r->addRecord(rr); - - } - if(!foundOne) { - if(d_doRecursion && DP->recurseFor(p)) { - try { - Resolver resolver; - resolver.resolve(arg()["recursor"],i->content.c_str(),QType::A); - Resolver::res_t res=resolver.result(); - for(Resolver::res_t::const_iterator j=res.begin();j!=res.end();++j) { - if(j->d_place==DNSResourceRecord::ANSWER) { - rr=*j; - rr.d_place=DNSResourceRecord::ADDITIONAL; - r->addRecord(rr); + if(!foundOne) { + if(d_doRecursion && DP->recurseFor(p)) { + try { + Resolver resolver; + resolver.resolve(arg()["recursor"],i->content.c_str(),QType::A); + Resolver::res_t res=resolver.result(); + for(Resolver::res_t::const_iterator j=res.begin();j!=res.end();++j) { + if(j->d_place==DNSResourceRecord::ANSWER) { + rr=*j; + rr.d_place=DNSResourceRecord::ADDITIONAL; + r->addRecord(rr); + } } } - } - catch(ResolverException& re) { - // L<qdomain<<"' query: "<qdomain<<"' query: "<&ret, int depth, int &res) { + bool giveNegative=false; string prefix(d_prefix), tuple; prefix.append(depth, ' '); - tuple=toLower(qname)+"|"+qtype.getName(); - LOG<::const_iterator ni=s_negcache.find(tuple); - if(ni!=s_negcache.end()) { - LOG<second<<") to prove it"<::const_iterator ni=s_negcache.find(toLower(qname)); + + LOG<second; sqt="SOA"; } + else { + tuple=toLower(qname)+"|"+qtype.getName(); + LOG<::const_iterator ni=s_negcache.find(tuple); + if(ni!=s_negcache.end()) { + LOG<second<<") to prove it"<second; + sqt="SOA"; + } + } set cset; bool found=false, expired=false; @@ -217,7 +231,7 @@ bool SyncRes::doCacheCheck(const string &qname, const QType &qtype, vectorttl>(unsigned int)time(0)) { DNSResourceRecord rr=*j; rr.ttl-=time(0); - if(res==RCode::NXDomain) + if(giveNegative) rr.d_place=DNSResourceRecord::AUTHORITY; ret.push_back(rr); LOG<<"[ttl="< nameservers, string auth, const string &qna string newauth, soaname, newtarget; for(LWRes::res_t::const_iterator i=result.begin();i!=result.end();++i) { - if(i->d_place==DNSResourceRecord::AUTHORITY && endsOn(qname,i->qname) && i->qtype.getCode()==QType::SOA) { - LOG<d_place==DNSResourceRecord::AUTHORITY && endsOn(qname,i->qname) && i->qtype.getCode()==QType::SOA && + d_lwr.d_rcode==RCode::NXDomain) { + LOG<qname; + + s_negcache[toLower(qname)]=i->qname; negindic=true; } else if(i->d_place==DNSResourceRecord::ANSWER && i->qname==qname && i->qtype.getCode()==QType::CNAME && (!(qtype==QType(QType::CNAME)))) { @@ -386,6 +402,14 @@ int SyncRes::doResolveAt(set nameservers, string auth, const string &qna LOG<qname<<"' -> '"<content<<"', had '"<content)); } + else if(i->d_place==DNSResourceRecord::AUTHORITY && endsOn(qname,i->qname) && i->qtype.getCode()==QType::SOA && + d_lwr.d_rcode==RCode::NoError) { + LOG<qtype.getName()+"'"<qname; + negindic=true; + } } if(done){ diff --git a/pdns/tcpreceiver.cc b/pdns/tcpreceiver.cc index b17ddd72d..5a79e2f48 100644 --- a/pdns/tcpreceiver.cc +++ b/pdns/tcpreceiver.cc @@ -73,6 +73,7 @@ void TCPNameserver::go() } catch(AhuException &ae) { L<(this)); } -- 2.40.0