From 849fde0b54008fe6ee068cacc7435b0627ff03b0 Mon Sep 17 00:00:00 2001 From: Bert Hubert Date: Sat, 7 Apr 2007 16:42:21 +0000 Subject: [PATCH] fix some MOADNSParser problems (notifications, for example), remove dead code, eliminate duplicate code, improve error reporting as reported in ticket 147 git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@1015 d19b8d6e-7fed-0310-83ef-9ca221ded41b --- pdns/communicator.cc | 9 +------ pdns/packethandler.cc | 16 ++++++------- pdns/resolver.cc | 53 ++++++++++++------------------------------ pdns/resolver.hh | 5 ++-- pdns/zoneparser-tng.cc | 2 +- 5 files changed, 26 insertions(+), 59 deletions(-) diff --git a/pdns/communicator.cc b/pdns/communicator.cc index bb001e8d8..5497e938e 100644 --- a/pdns/communicator.cc +++ b/pdns/communicator.cc @@ -258,14 +258,7 @@ void CommunicatorClass::slaveRefresh(PacketHandler *P) break; } - resolver.sendSoaSerialRequest(i->master,i->zone); - string master, zone; - int res=resolver.getSoaSerialAnswer(master,zone,&theirserial); - - if(res<=0) { - L<zone<<" at "<master<master, i->zone, &theirserial); if(theirserialserial) { L<zone<<" more recent than master, our serial "< their serial "<getRemote(),p->qdomain, &theirserial); - if(res<=0) { - L<qdomain<<" at potential supermaster "<getRemote()<getRemote(),p->qdomain, &theirserial); resolver.resolve(p->getRemote(),p->qdomain.c_str(), QType::NS); nsset=resolver.result(); } catch(ResolverException &re) { - L<qdomain<<"' at "<getRemote()<getRemote() <<": "<getRemote(),p->qdomain, &theirserial); - if(res<=0) { - L<qdomain<<" at "<getRemote()<getRemote(),p->qdomain, &theirserial); + } + catch(ResolverException& re) { + L< packet; - DNSPacketWriter pw(packet, domain, QType::SOA, Opcode::Notify); - pw.getHeader()->id = id; + DNSPacketWriter pw(packet, domain, QType::SOA, 1, Opcode::Notify); + pw.getHeader()->id = d_randomid = id; ComboAddress dest(ip, 53); @@ -153,6 +153,7 @@ void Resolver::sendResolve(const string &ip, const char *domain, int type) { vector packet; DNSPacketWriter pw(packet, domain, type); + pw.getHeader()->id = d_randomid = random(); d_domain=domain; d_type=type; @@ -201,7 +202,7 @@ int Resolver::receiveResolve(struct sockaddr* fromaddr, Utility::socklen_t addrl int Resolver::resolve(const string &ip, const char *domain, int type) { makeUDPSocket(); - sendResolve(ip,domain,type); + sendResolve(ip, domain, type); try { struct sockaddr_in from; return receiveResolve((sockaddr*)&from, sizeof(from)); @@ -298,6 +299,7 @@ int Resolver::axfr(const string &ip, const char *domain) vector packet; DNSPacketWriter pw(packet, domain, QType::AXFR); + pw.getHeader()->id = d_randomid = random(); uint16_t replen=htons(packet.size()); Utility::iovec iov[2]; @@ -381,7 +383,6 @@ int Resolver::axfrChunk(Resolver::res_t &res) return 1; } - Resolver::res_t Resolver::result() { shared_ptr mdp; @@ -392,6 +393,9 @@ Resolver::res_t Resolver::result() catch(...) { throw ResolverException("resolver: unable to parse packet of "+itoa(d_len)+" bytes"); } + if(mdp->d_header.id != d_randomid) { + throw ResolverException("Remote nameserver replied with wrong id"); + } if(mdp->d_header.rcode) if(d_inaxfr) throw ResolverException("Remote nameserver unable/unwilling to AXFR with us: RCODE="+itoa(mdp->d_header.rcode)); @@ -425,7 +429,6 @@ Resolver::res_t Resolver::result() rr.content=unquotify(rr.content); if(rr.qtype.getCode() == QType::MX) { - vector parts; stringtok(parts, rr.content); rr.priority = atoi(parts[0].c_str()); @@ -444,47 +447,21 @@ Resolver::res_t Resolver::result() return ret; } -void Resolver::sendSoaSerialRequest(const string &ip, const string &domain) -{ - sendResolve(ip,domain.c_str(),QType::SOA); -} - -int Resolver::getSoaSerialAnswer(string &master, string &zone, uint32_t* serial) +void Resolver::getSoaSerial(const string &ip, const string &domain, uint32_t *serial) { - struct sockaddr_in fromaddr; - Utility::socklen_t addrlen=sizeof(fromaddr); - - receiveResolve((struct sockaddr*)&fromaddr, addrlen); + resolve(ip, domain.c_str(), QType::SOA); res_t res=result(); if(res.empty()) - return 0; - - vectorparts; - stringtok(parts,res[0].content); - if(parts.size()<3) - return 0; - - *serial=strtoul(parts[2].c_str(), NULL, 10); - master=""; // fix this!! - zone=res[0].qname; - - return 1; -} + throw ResolverException("Query to '" + ip + "' for SOA of '" + domain + "' produced no answers"); + if(res[0].qtype.getCode() != QType::SOA) + throw ResolverException("Query to '" + ip + "' for SOA of '" + domain + "' produced a "+res[0].qtype.getName()+" record"); -int Resolver::getSoaSerial(const string &ip, const string &domain, uint32_t *serial) -{ - resolve(ip,domain.c_str(),QType::SOA); - res_t res=result(); - if(res.empty()) - return 0; - vectorparts; - stringtok(parts,res[0].content); + stringtok(parts, res[0].content); if(parts.size()<3) - return 0; + throw ResolverException("Query to '" + ip + "' for SOA of '" + domain + "' produced an unparseable response"); *serial=(uint32_t)atol(parts[2].c_str()); - return 1; } diff --git a/pdns/resolver.hh b/pdns/resolver.hh index 0808aa82f..8e1c71714 100644 --- a/pdns/resolver.hh +++ b/pdns/resolver.hh @@ -61,9 +61,7 @@ public: int receiveResolve(struct sockaddr* fromaddr, Utility::socklen_t addrlen); char* sendReceive(const string &ip, uint16_t remotePort, const char *packet, int length, unsigned int *replylen); - int getSoaSerial(const string &, const string &, uint32_t *); - void sendSoaSerialRequest(const string &ip, const string &domain); - int getSoaSerialAnswer(string &master, string &zone, uint32_t* serial); + void getSoaSerial(const string &, const string &, uint32_t *); int axfrChunk(Resolver::res_t &res); vector result(); @@ -81,6 +79,7 @@ private: int d_type; int d_timeout; uint32_t d_ip; + uint16_t d_randomid; bool d_inaxfr; ComboAddress d_toaddr; }; diff --git a/pdns/zoneparser-tng.cc b/pdns/zoneparser-tng.cc index 588a85ffe..24f23dfb5 100644 --- a/pdns/zoneparser-tng.cc +++ b/pdns/zoneparser-tng.cc @@ -309,7 +309,7 @@ bool ZoneParserTNG::get(DNSResourceRecord& rr) rr.content=d_line.substr(range.first); chopComment(rr.content); - // cerr<<"rr.content before possible elide: '"<