]> granicus.if.org Git - pdns/commitdiff
perform better accounting of TCP client numbers on DNS errors - spotted by Simon...
authorBert Hubert <bert.hubert@netherlabs.nl>
Fri, 18 Jun 2010 18:57:02 +0000 (18:57 +0000)
committerBert Hubert <bert.hubert@netherlabs.nl>
Fri, 18 Jun 2010 18:57:02 +0000 (18:57 +0000)
git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@1640 d19b8d6e-7fed-0310-83ef-9ca221ded41b

pdns/pdns_recursor.cc

index 7a373b93a7e1c42ac07cef6f3ccee92ddc31ff43..375b879a9b8ddcc9d1f08a44bf14903579125662 100644 (file)
@@ -594,6 +594,7 @@ void startDoResolve(void *p)
       if(hadError) {
         // no need to remove us from FDM, we weren't there
         TCPConnection::closeAndCleanup(dc->d_socket, dc->d_remote);
+        dc->d_socket = -1;
       }
       else {
         TCPConnection tc;
@@ -631,15 +632,26 @@ void startDoResolve(void *p)
       g_stats.avgLatencyUsec=(uint64_t)((1-0.0001)*g_stats.avgLatencyUsec + 0.0001*newLat);
 
     delete dc;
+    dc=0;
   }
   catch(AhuException &ae) {
     L<<Logger::Error<<"startDoResolve problem: "<<ae.reason<<endl;
+    if(dc && dc->d_tcp && dc->d_socket >= 0) 
+      TCPConnection::closeAndCleanup(dc->d_socket, dc->d_remote);
+    delete dc;
   }
   catch(MOADNSException& e) {
+    if(dc && dc->d_tcp && dc->d_socket >= 0) 
+      TCPConnection::closeAndCleanup(dc->d_socket, dc->d_remote);
+      
     L<<Logger::Error<<"DNS parser error: "<<dc->d_mdp.d_qname<<", "<<e.what()<<endl;
+    delete dc;
   }
   catch(std::exception& e) {
     L<<Logger::Error<<"STL error: "<<e.what()<<endl;
+    if(dc && dc->d_tcp && dc->d_socket >= 0) 
+      TCPConnection::closeAndCleanup(dc->d_socket, dc->d_remote);
+    delete dc;
   }
   catch(...) {
     L<<Logger::Error<<"Any other exception in a resolver context"<<endl;
@@ -1523,6 +1535,7 @@ void parseACLs()
   else if(!::arg()["allow-from"].empty()) {
     vector<string> ips;
     stringtok(ips, ::arg()["allow-from"], ", ");
+    
     L<<Logger::Warning<<"Only allowing queries from: ";
     for(vector<string>::const_iterator i = ips.begin(); i!= ips.end(); ++i) {
       allowFrom->addMask(*i);
@@ -1592,6 +1605,7 @@ int serviceMain(int argc, char*argv[])
     stringtok(ips, ::arg()["dont-query"], ", ");
     ips.push_back("0.0.0.0");
     ips.push_back("::");
+
     L<<Logger::Warning<<"Will not send queries to: ";
     for(vector<string>::const_iterator i = ips.begin(); i!= ips.end(); ++i) {
       g_dontQuery->addMask(*i);