]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
iputils.hh: NetmaskTree: Always normalize key netmasks.
authorStephan Bosch <stephan.bosch@open-xchange.com>
Wed, 9 Oct 2019 20:49:21 +0000 (22:49 +0200)
committerStephan Bosch <stephan.bosch@open-xchange.com>
Tue, 11 Feb 2020 01:49:34 +0000 (02:49 +0100)
This makes address bits below the network mask all zero, which is consistent
with the tree's behavior.

This change addresses one sensitivity to this behavioral change in the recursor
cache.

pdns/iputils.hh
pdns/recursor_cache.cc
pdns/recursor_cache.hh

index 1cc160e28bae0d23667b63395a8d090a5755a16d..ea9703076442f468aa699983226d7f7e16b676c6 100644 (file)
@@ -632,6 +632,9 @@ private:
  * to a *LIST* of *PREFIXES*. Not the other way round.
  *
  * You can store IPv4 and IPv6 addresses to same tree, separate payload storage is kept per AFI.
+ * Network prefixes (Netmasks) are always recorded in normalized fashion, meaning that only
+ * the network bits are set. This is what is returned in the insert() and lookup() return
+ * values.
  *
  * Use swap if you need to move the tree to another NetmaskTree instance, it is WAY faster
  * than using copy ctor or assignment operator, since it moves the nodes and tree root to
@@ -657,7 +660,7 @@ private:
       parent(nullptr), node(new node_type()), assigned(false), d_bits(0) {
     }
     explicit TreeNode(const key_type& key) noexcept :
-      parent(nullptr), node(new node_type({key, value_type()})),
+      parent(nullptr), node(new node_type({key.getNormalized(), value_type()})),
       assigned(false), d_bits(key.getAddressBits()) {
     }
 
@@ -906,8 +909,6 @@ public:
       node->assigned = true;
     }
 
-    // assign key
-    value->first = key;
     return *value;
   }
 
index ca1f8bd1cbe029bc07fcf12ed2de378790bd6417..0ea942ed49c4ebdd9fb62ac85fee6a8ca6bef28d 100644 (file)
@@ -240,6 +240,9 @@ void MemRecursorCache::replace(time_t now, const DNSName &qname, const QType& qt
 {
   d_cachecachevalid = false;
   //  cerr<<"Replacing "<<qname<<" for "<< (ednsmask ? ednsmask->toString() : "everyone") << endl;
+  if (ednsmask) {
+    ednsmask = ednsmask->getNormalized();
+  }
   auto key = boost::make_tuple(qname, qt.getCode(), ednsmask ? *ednsmask : Netmask());
   bool isNew = false;
   cache_t::iterator stored = d_cache.find(key);
index e9a44c86c747c4edd173fa3d9402b4e47e343a91..d298671ba0b7fef35fb8b7bc41b85da637554356 100644 (file)
@@ -73,7 +73,7 @@ private:
   struct CacheEntry
   {
     CacheEntry(const boost::tuple<DNSName, uint16_t, Netmask>& key, bool auth):
-      d_qname(key.get<0>()), d_netmask(key.get<2>()), d_state(Indeterminate), d_ttd(0), d_qtype(key.get<1>()), d_auth(auth)
+      d_qname(key.get<0>()), d_netmask(key.get<2>().getNormalized()), d_state(Indeterminate), d_ttd(0), d_qtype(key.get<1>()), d_auth(auth)
     {
     }