]> granicus.if.org Git - pdns/commitdiff
catch errors in the packetcache and report them (and don't crash)
authorBert Hubert <bert.hubert@netherlabs.nl>
Thu, 7 Jan 2010 16:11:37 +0000 (16:11 +0000)
committerBert Hubert <bert.hubert@netherlabs.nl>
Thu, 7 Jan 2010 16:11:37 +0000 (16:11 +0000)
git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@1494 d19b8d6e-7fed-0310-83ef-9ca221ded41b

pdns/pdns_recursor.cc

index 4ce55a00913b8ce81d59a98e516288e87e0bdccc..7ceadba20f760f40744cb31f40216b67a25323cc 100644 (file)
@@ -804,16 +804,21 @@ void handleNewUDPQuestion(int fd, FDMultiplexer::funcparam_t& var)
         ++g_stats.qcounter;
 
         string response;
-        if(!SyncRes::s_nopacketcache && t_packetCache->getResponsePacket(string(data, len), g_now.tv_sec, &response)) {
-          if(!g_quiet)
-            L<<Logger::Error<<t_id<< " question answered from packet cache from "<<fromaddr.toString()<<endl;
-
-          g_stats.packetCacheHits++;
-          SyncRes::s_queries++;
-          sendto(fd, response.c_str(), response.length(), 0, (struct sockaddr*) &fromaddr, fromaddr.getSocklen());
-          return;
+        try {
+          if(!SyncRes::s_nopacketcache && t_packetCache->getResponsePacket(string(data, len), g_now.tv_sec, &response)) {
+            if(!g_quiet)
+              L<<Logger::Error<<t_id<< " question answered from packet cache from "<<fromaddr.toString()<<endl;
+  
+            g_stats.packetCacheHits++;
+            SyncRes::s_queries++;
+            sendto(fd, response.c_str(), response.length(), 0, (struct sockaddr*) &fromaddr, fromaddr.getSocklen());
+            return;
+          }
+        } 
+        catch(std::exception& e) {
+          L<<Logger::Error<<t_id<< " packetcache error because of packet from "<<fromaddr.toStringWithPort()<<endl;
+          L<<Logger::Error<<t_id<< makeHexDump(string(data, len)) <<endl;
         }
-
         DNSComboWriter* dc = new DNSComboWriter(data, len, g_now);
         dc->setSocket(fd);
         dc->setRemote(&fromaddr);