]> granicus.if.org Git - pdns/commitdiff
fix reload on database error on incoming notification, mostly caused by idle database...
authorBert Hubert <bert.hubert@netherlabs.nl>
Sun, 27 Mar 2011 10:03:59 +0000 (10:03 +0000)
committerBert Hubert <bert.hubert@netherlabs.nl>
Sun, 27 Mar 2011 10:03:59 +0000 (10:03 +0000)
git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@2101 d19b8d6e-7fed-0310-83ef-9ca221ded41b

pdns/packethandler.cc

index 631b00e46a966e7a7ca185128cddc7251303ca66..85ce5c816f318f6c0dc243791e8518cde565c10f 100644 (file)
@@ -1103,7 +1103,6 @@ bool PacketHandler::tryWildcard(DNSPacket *p, DNSPacket*r, SOAData& sd, string &
   return true;
 }
 
-
 //! Called by the Distributor to ask a question. Returns 0 in case of an error
 DNSPacket *PacketHandler::questionOrRecurse(DNSPacket *p, bool *shouldRecurse)
 {
@@ -1119,7 +1118,7 @@ DNSPacket *PacketHandler::questionOrRecurse(DNSPacket *p, bool *shouldRecurse)
   vector<DNSResourceRecord> rrset;
   bool weDone=0, weRedirected=0, weHaveUnauth=0;
 
-  DNSPacket *r=0;
+  DNSPacket *r=p->replyPacket();  // generate an empty reply packet
   bool noCache=false;
   if(p->d_havetsig) {
     string keyname, secret;
@@ -1127,7 +1126,6 @@ DNSPacket *PacketHandler::questionOrRecurse(DNSPacket *p, bool *shouldRecurse)
     if(!checkForCorrectTSIG(p, &B, &keyname, &secret, &trc)) {
       if(d_logDNSDetails)
         L<<Logger::Error<<"Received a TSIG signed message with a non-validating key"<<endl;
-      r=p->replyPacket(); 
       r->setRcode(RCode::NotAuth);
       return r;
     }
@@ -1139,6 +1137,7 @@ DNSPacket *PacketHandler::questionOrRecurse(DNSPacket *p, bool *shouldRecurse)
     if(p->d.qr) { // QR bit from dns packet (thanks RA from N)
       L<<Logger::Error<<"Received an answer (non-query) packet from "<<p->getRemote()<<", dropping"<<endl;
       S.inc("corrupt-packets");
+      delete r;
       return 0;
     }
 
@@ -1148,7 +1147,6 @@ DNSPacket *PacketHandler::questionOrRecurse(DNSPacket *p, bool *shouldRecurse)
       if(d_logDNSDetails)
         L<<Logger::Error<<"Received a malformed qdomain from "<<p->getRemote()<<", '"<<p->qdomain<<"': sending servfail"<<endl;
       S.inc("corrupt-packets");
-      r=p->replyPacket(); 
       r->setRcode(RCode::ServFail);
       return r;
     }
@@ -1156,31 +1154,29 @@ DNSPacket *PacketHandler::questionOrRecurse(DNSPacket *p, bool *shouldRecurse)
       if(p->d.opcode==Opcode::Update) {
         if(::arg().mustDo("log-failed-updates"))
           L<<Logger::Notice<<"Received an UPDATE opcode from "<<p->getRemote()<<" for "<<p->qdomain<<", sending NOTIMP"<<endl;
-        r=p->replyPacket(); 
         r->setRcode(RCode::NotImp); // notimp;
         return r; 
       }
       else if(p->d.opcode==Opcode::Notify) {
         int res=processNotify(p);
         if(res>=0) {
-          DNSPacket *r=p->replyPacket();
           r->setRcode(res);
           r->setOpcode(Opcode::Notify);
           return r;
         }
+        delete r;
         return 0;
       }
       
       L<<Logger::Error<<"Received an unknown opcode "<<p->d.opcode<<" from "<<p->getRemote()<<" for "<<p->qdomain<<endl;
 
-      r=p->replyPacket(); 
       r->setRcode(RCode::NotImp); 
       return r; 
     }
 
     // L<<Logger::Warning<<"Query for '"<<p->qdomain<<"' "<<p->qtype.getName()<<" from "<<p->getRemote()<<endl;
     
-    r=p->replyPacket();  // generate an empty reply packet
+    
     if(p->d.rd && d_doRecursion && DP->recurseFor(p))  // make sure we set ra if rd was set, and we'll do it
       r->d.ra=true;
 
@@ -1336,13 +1332,18 @@ DNSPacket *PacketHandler::questionOrRecurse(DNSPacket *p, bool *shouldRecurse)
     }
     
   sendit:;
-    if(doAdditionalProcessingAndDropAA(p, r, sd)<0)
+    if(doAdditionalProcessingAndDropAA(p, r, sd)<0) {
+      delete r;
       return 0;
+    }
 
     //    doDNSSECProcessing(p, r);
 
     if(p->d_dnssecOk)
       addRRSigs(d_dk, B, sd.qname, r->getRRS());
+      
+    // editSOA(d_dk, sd.qname, r);
+      
     r->wrapup(); // needed for inserting in cache
     if(!noCache)
       PC.insert(p, r); // in the packet cache