]> granicus.if.org Git - pdns/commitdiff
fix some MOADNSParser problems (notifications, for example), remove dead code, elimin...
authorBert Hubert <bert.hubert@netherlabs.nl>
Sat, 7 Apr 2007 16:42:21 +0000 (16:42 +0000)
committerBert Hubert <bert.hubert@netherlabs.nl>
Sat, 7 Apr 2007 16:42:21 +0000 (16:42 +0000)
git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@1015 d19b8d6e-7fed-0310-83ef-9ca221ded41b

pdns/communicator.cc
pdns/packethandler.cc
pdns/resolver.cc
pdns/resolver.hh
pdns/zoneparser-tng.cc

index bb001e8d890e6b90aab8d1a7425e2fc5111e8674..5497e938e20eb2184ff7b7b10d46ac6f7814b15f 100644 (file)
@@ -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<<Logger::Error<<"Unable to determine SOA serial for "<<i->zone<<" at "<<i->master<<endl;
-       continue;
-      }
+      resolver.getSoaSerial(i->master, i->zone, &theirserial);
       
       if(theirserial<i->serial) {
        L<<Logger::Error<<"Domain "<<i->zone<<" more recent than master, our serial "<<ourserial<<" > their serial "<<theirserial<<endl;
index ca000dfc798ab8dff26d08e9b4b69e4be45ee890..1b3169816e665c4cac578a9ea538f89c8f7642ec 100644 (file)
@@ -458,18 +458,14 @@ int PacketHandler::trySuperMaster(DNSPacket *p)
   try {
     Resolver resolver;
     uint32_t theirserial;
-    int res=resolver.getSoaSerial(p->getRemote(),p->qdomain, &theirserial);  
-    if(res<=0) {
-      L<<Logger::Error<<"Unable to determine SOA serial for "<<p->qdomain<<" at potential supermaster "<<p->getRemote()<<endl;
-      return RCode::ServFail;
-    }
+    resolver.getSoaSerial(p->getRemote(),p->qdomain, &theirserial);  
   
     resolver.resolve(p->getRemote(),p->qdomain.c_str(), QType::NS);
 
     nsset=resolver.result();
   }
   catch(ResolverException &re) {
-    L<<Logger::Error<<"Error resolving SOA or NS for '"<<p->qdomain<<"' at "<<p->getRemote()<<endl;
+    L<<Logger::Error<<"Error resolving SOA or NS at: "<< p->getRemote() <<": "<<re.reason<<endl;
     return RCode::ServFail;
   }
 
@@ -515,9 +511,11 @@ int PacketHandler::processNotify(DNSPacket *p)
   /* this is an instant DoS, just spoof notifications from the address of the master and we block  */
 
   Resolver resolver;
-  int res=resolver.getSoaSerial(p->getRemote(),p->qdomain, &theirserial);
-  if(res<=0) {
-    L<<Logger::Error<<"Unable to determine SOA serial for "<<p->qdomain<<" at "<<p->getRemote()<<endl;
+  try {
+    resolver.getSoaSerial(p->getRemote(),p->qdomain, &theirserial);
+  }
+  catch(ResolverException& re) {
+    L<<Logger::Error<<re.reason<<endl;
     return RCode::ServFail;
   }
        
index 8a6015525fb21465c8f816884a803c75e401ad41..4f4e13aa492cf8a16853a0927ffbb6bc825df8ea 100644 (file)
@@ -138,8 +138,8 @@ char* Resolver::sendReceive(const string &ip, uint16_t remotePort, const char *p
 int Resolver::notify(int sock, const string &domain, const string &ip, uint16_t id)
 {
   vector<uint8_t> 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<uint8_t> 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<uint8_t> 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<MOADNSParser> 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<string> 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;
-  
-  vector<string>parts;
-  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;
-  
   vector<string>parts;
-  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;
 }
 
index 0808aa82f9488ced1b424b0b5b1e2ce53fc4cf77..8e1c71714abc7582f33b2fa47e7e16f1af01ad55 100644 (file)
@@ -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<DNSResourceRecord> 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;
 };
index 588a85ffe8d2b0c232f657fa172b82a87f7c9518..24f23dfb514d725adc3d111724c42511698c9129 100644 (file)
@@ -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: '"<<rr.content<<"'\n";
+
   if(findAndElide(rr.content, '(')) {      // have found a ( and elided it
     if(!findAndElide(rr.content, ')')) {
       while(getLine()) {