Index: trunk/pdns/pdns/packethandler.cc
===================================================================
--- trunk/pdns/pdns/packethandler.cc	(revision 2100)
+++ trunk/pdns/pdns/packethandler.cc	(revision 2101)
@@ -1104,5 +1104,4 @@
 }
 
-
 //! Called by the Distributor to ask a question. Returns 0 in case of an error
 DNSPacket *PacketHandler::questionOrRecurse(DNSPacket *p, bool *shouldRecurse)
@@ -1120,5 +1119,5 @@
   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) {
@@ -1128,5 +1127,4 @@
       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;
@@ -1140,4 +1138,5 @@
       L<<Logger::Error<<"Received an answer (non-query) packet from "<<p->getRemote()<<", dropping"<<endl;
       S.inc("corrupt-packets");
+      delete r;
       return 0;
     }
@@ -1149,5 +1148,4 @@
         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;
@@ -1157,5 +1155,4 @@
         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; 
@@ -1164,9 +1161,9 @@
         int res=processNotify(p);
         if(res>=0) {
-          DNSPacket *r=p->replyPacket();
           r->setRcode(res);
           r->setOpcode(Opcode::Notify);
           return r;
         }
+        delete r;
         return 0;
       }
@@ -1174,5 +1171,4 @@
       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; 
@@ -1181,5 +1177,5 @@
     // 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;
@@ -1337,6 +1333,8 @@
     
   sendit:;
-    if(doAdditionalProcessingAndDropAA(p, r, sd)<0)
+    if(doAdditionalProcessingAndDropAA(p, r, sd)<0) {
+      delete r;
       return 0;
+    }
 
     //    doDNSSECProcessing(p, r);
@@ -1344,4 +1342,7 @@
     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)
