]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
- infra cache entries that are expired are wiped clean. Previously
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Thu, 29 Apr 2010 14:12:54 +0000 (14:12 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Thu, 29 Apr 2010 14:12:54 +0000 (14:12 +0000)
        it was possible to not expire host data (if accessed often).

git-svn-id: file:///svn/unbound/trunk@2106 be551aaa-1e26-0410-a405-d3ace91eadb9

doc/Changelog
services/cache/infra.c

index 28da4ea95e28ff6d469d24f7c3e1495c26adcb9e..f89f474da79a8f78aeac17f16ef948dc3f4410c0 100644 (file)
@@ -1,5 +1,7 @@
 29 April 2010: Wouter
        - Fix for dnssec lameness detection to use the key cache.
+       - infra cache entries that are expired are wiped clean.  Previously
+         it was possible to not expire host data (if accessed often).
 
 28 April 2010: Wouter
        - ldns tarball updated and GOST support is detected and then enabled. 
index 9c32c8110e02a3045a0abb9cd04a71ca58de6b3a..6066f98bb4beba72b943ebfec2c0f805d28b6eb8 100644 (file)
@@ -187,6 +187,19 @@ infra_lookup_host(struct infra_cache* infra,
        return data;
 }
 
+/** init the host elements (not lame elems) */
+static void
+host_entry_init(struct infra_cache* infra, struct lruhash_entry* e, 
+       uint32_t timenow)
+{
+       struct infra_host_data* data = (struct infra_host_data*)e->data;
+       data->ttl = timenow + infra->host_ttl;
+       rtt_init(&data->rtt);
+       data->edns_version = 0;
+       data->edns_lame_known = 0;
+       data->num_timeouts = 0;
+}
+
 /** 
  * Create and init a new entry for a host 
  * @param infra: infra structure with config parameters.
@@ -216,12 +229,8 @@ new_host_entry(struct infra_cache* infra, struct sockaddr_storage* addr,
        key->entry.data = (void*)data;
        key->addrlen = addrlen;
        memcpy(&key->addr, addr, addrlen);
-       data->ttl = tm + infra->host_ttl;
        data->lameness = NULL;
-       data->edns_version = 0;
-       data->edns_lame_known = 0;
-       data->num_timeouts = 0;
-       rtt_init(&data->rtt);
+       host_entry_init(infra, &key->entry, tm);
        return &key->entry;
 }
 
@@ -240,12 +249,8 @@ infra_host(struct infra_cache* infra, struct sockaddr_storage* addr,
                if(e) {
                        /* if its still there we have a writelock, init */
                        /* re-initialise */
-                       data = (struct infra_host_data*)e->data;
-                       data->ttl = timenow + infra->host_ttl;
-                       rtt_init(&data->rtt);
                        /* do not touch lameness, it may be valid still */
-                       data->edns_version = 0;
-                       data->edns_lame_known = 0;
+                       host_entry_init(infra, e, timenow);
                }
        }
        if(!e) {
@@ -469,10 +474,11 @@ infra_rtt_update(struct infra_cache* infra,
                if(!(e = new_host_entry(infra, addr, addrlen, timenow)))
                        return 0;
                needtoinsert = 1;
-       }
-       /* have an entry, update the rtt, and the ttl */
+       } else if(((struct infra_host_data*)e->data)->ttl < timenow) {
+               host_entry_init(infra, e, timenow);
+       } 
+       /* have an entry, update the rtt */
        data = (struct infra_host_data*)e->data;
-       data->ttl = timenow + infra->host_ttl;
        if(roundtrip == -1) {
                rtt_lost(&data->rtt, orig_rtt);
                if(data->num_timeouts<255)
@@ -503,10 +509,11 @@ infra_edns_update(struct infra_cache* infra,
                if(!(e = new_host_entry(infra, addr, addrlen, timenow)))
                        return 0;
                needtoinsert = 1;
-       }
+       } else if(((struct infra_host_data*)e->data)->ttl < timenow) {
+               host_entry_init(infra, e, timenow);
+       } 
        /* have an entry, update the rtt, and the ttl */
        data = (struct infra_host_data*)e->data;
-       data->ttl = timenow + infra->host_ttl;
        data->edns_version = edns_version;
        data->edns_lame_known = 1;