]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Don't cache answers without any TTL 4987/head
authorRemi Gacogne <remi.gacogne@powerdns.com>
Wed, 8 Feb 2017 16:19:18 +0000 (17:19 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Wed, 8 Feb 2017 16:19:18 +0000 (17:19 +0100)
`RFC2308` states that "negative responses without SOA records SHOULD
NOT be cached as there is no way to prevent the negative responses
looping forever between a pair of servers even with a short TTL".

pdns/dnsdist-cache.cc
regression-tests.dnsdist/test_Caching.py

index 24bd53fe39b191e113affb7ee61ead9b6ad804f8..ec3358795fa7a360e1f7898399e1f58dfb92ca35 100644 (file)
@@ -56,8 +56,15 @@ void DNSDistPacketCache::insert(uint32_t key, const DNSName& qname, uint16_t qty
   }
   else {
     minTTL = getMinTTL(response, responseLen);
-    if (minTTL > d_maxTTL)
+
+    /* no TTL found, we don't want to cache this */
+    if (minTTL == std::numeric_limits<uint32_t>::max()) {
+      return;
+    }
+
+    if (minTTL > d_maxTTL) {
       minTTL = d_maxTTL;
+    }
 
     if (minTTL < d_minTTL) {
       d_ttlTooShorts++;
index 46d3329ae897306039a49b6ebf02af1761d50d1d..832ca80af2fe103c548abcf40cd8c2335fdc0d9b 100644 (file)
@@ -874,6 +874,41 @@ class TestCachingTTL(DNSDistTest):
 
         self.assertEquals(total, misses)
 
+    def testCacheNXWithNoRR(self):
+        """
+        Cache: NX with no RR
+
+        """
+        misses = 0
+        name = 'nxwithnorr.cache.tests.powerdns.com.'
+        query = dns.message.make_query(name, 'A', 'IN')
+        response = dns.message.make_response(query)
+        response.set_rcode(dns.rcode.NXDOMAIN)
+
+        # Miss
+        (receivedQuery, receivedResponse) = self.sendUDPQuery(query, response)
+        self.assertTrue(receivedQuery)
+        self.assertTrue(receivedResponse)
+        receivedQuery.id = query.id
+        self.assertEquals(query, receivedQuery)
+        self.assertEquals(response, receivedResponse)
+        misses += 1
+
+        # We should not have been cached
+        (receivedQuery, receivedResponse) = self.sendUDPQuery(query, response)
+        self.assertTrue(receivedQuery)
+        self.assertTrue(receivedResponse)
+        receivedQuery.id = query.id
+        self.assertEquals(query, receivedQuery)
+        self.assertEquals(response, receivedResponse)
+        misses += 1
+
+        total = 0
+        for key in self._responsesCounter:
+            total += self._responsesCounter[key]
+
+        self.assertEquals(total, misses)
+
 class TestCachingLongTTL(DNSDistTest):
 
     _maxCacheTTL = 2