]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
Fixup negative TTLs Attila Nagy has reported.
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Thu, 16 Oct 2008 13:12:32 +0000 (13:12 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Thu, 16 Oct 2008 13:12:32 +0000 (13:12 +0000)
git-svn-id: file:///svn/unbound/trunk@1306 be551aaa-1e26-0410-a405-d3ace91eadb9

daemon/cachedump.c
doc/Changelog
services/cache/rrset.c
util/data/msgencode.c
util/data/packed_rrset.c
validator/val_utils.c

index 2d800e5c34ab3f1f4e6461fe0b015dc71e54606e..4466290d9767d6d56533e5ee03135adf1f22eff6 100644 (file)
@@ -67,7 +67,9 @@ to_rr(struct ub_packed_rrset_key* k, struct packed_rrset_data* d,
        }
        ldns_rr_set_type(rr, type);
        ldns_rr_set_class(rr, ntohs(k->rk.rrset_class));
-       ldns_rr_set_ttl(rr, d->rr_ttl[i] - now);
+       if(d->rr_ttl[i] < now)
+               ldns_rr_set_ttl(rr, 0);
+       else    ldns_rr_set_ttl(rr, d->rr_ttl[i] - now);
        pos = 0;
        status = ldns_wire2dname(&rdf, k->rk.dname, k->rk.dname_len, &pos);
        if(status != LDNS_STATUS_OK) {
index be1336228275ee78626e1e87b9396a7130e869f9..8c11885ea57bfcb67672535e0d00ef3269a78b8c 100644 (file)
@@ -1,3 +1,6 @@
+16 October 2008: Wouter
+       - Fixup negative TTL values appearing (reported by Attila Nagy).
+
 15 October 2008: Wouter
        - better documentation for 0x20; remove fallback TODO, it is done.
        - harden-referral-path feature includes A, AAAA queries for glue,
index c9856c96c4638a948a68001696fbdfe681bd1bd0..7215990960bda9a05abd090ca49850b1da37dcda 100644 (file)
@@ -334,10 +334,13 @@ rrset_update_sec_status(struct rrset_cache* r,
        }
        /* update the cached rrset */
        if(updata->security > cachedata->security) {
+               size_t i;
                if(updata->trust > cachedata->trust)
                        cachedata->trust = updata->trust;
                cachedata->security = updata->security;
                cachedata->ttl = updata->ttl + now;
+               for(i=0; i<cachedata->count+cachedata->rrsig_count; i++)
+                       cachedata->rr_ttl[i] = updata->rr_ttl[i]+now;
        }
        lock_rw_unlock(&e->lock);
 }
@@ -364,8 +367,15 @@ rrset_check_sec_status(struct rrset_cache* r,
        }
        if(cachedata->security > updata->security) {
                updata->security = cachedata->security;
-               if(cachedata->security == sec_status_bogus)
+               if(cachedata->security == sec_status_bogus) {
+                       size_t i;
                        updata->ttl = cachedata->ttl - now;
+                       for(i=0; i<cachedata->count+cachedata->rrsig_count; i++)
+                               if(cachedata->rr_ttl[i] < now)
+                                       updata->rr_ttl[i] = 0;
+                               else updata->rr_ttl[i] = 
+                                       cachedata->rr_ttl[i]-now;
+               }
                if(cachedata->trust > updata->trust)
                        updata->trust = cachedata->trust;
        }
index 33685e8697f288408839d104802cf4bb8a050e3d..75e199d9300ffb27e1b16c4b13251c3e3e1c9617 100644 (file)
@@ -466,7 +466,10 @@ packed_rrset_encode(struct ub_packed_rrset_key* key, ldns_buffer* pkt,
                                return r;
                        ldns_buffer_write(pkt, &key->rk.type, 2);
                        ldns_buffer_write(pkt, &key->rk.rrset_class, 2);
-                       ldns_buffer_write_u32(pkt, data->rr_ttl[i]-timenow);
+                       if(data->rr_ttl[i] < timenow)
+                               ldns_buffer_write_u32(pkt, 0);
+                       else    ldns_buffer_write_u32(pkt, 
+                                       data->rr_ttl[i]-timenow);
                        if(c) {
                                if((r=compress_rdata(pkt, data->rr_data[i],
                                        data->rr_len[i], region, tree, c))
@@ -500,7 +503,10 @@ packed_rrset_encode(struct ub_packed_rrset_key* key, ldns_buffer* pkt,
                        }
                        ldns_buffer_write_u16(pkt, LDNS_RR_TYPE_RRSIG);
                        ldns_buffer_write(pkt, &key->rk.rrset_class, 2);
-                       ldns_buffer_write_u32(pkt, data->rr_ttl[i]-timenow);
+                       if(data->rr_ttl[i] < timenow)
+                               ldns_buffer_write_u32(pkt, 0);
+                       else    ldns_buffer_write_u32(pkt, 
+                                       data->rr_ttl[i]-timenow);
                        /* rrsig rdata cannot be compressed, perform 100+ byte
                         * memcopy. */
                        ldns_buffer_write(pkt, data->rr_data[i],
index 74855c9c0a446e4a435331f89f1b3c0dc06ec2b6..5925b87577fdae51c49a4692b13ddb0829e79e93 100644 (file)
@@ -292,9 +292,14 @@ packed_rrset_copy_region(struct ub_packed_rrset_key* key,
        ck->entry.data = d;
        packed_rrset_ptr_fixup(d);
        /* make TTLs relative - once per rrset */
-       for(i=0; i<d->count + d->rrsig_count; i++)
-               d->rr_ttl[i] -= now;
-       d->ttl -= now;
+       for(i=0; i<d->count + d->rrsig_count; i++) {
+               if(d->rr_ttl[i] < now)
+                       d->rr_ttl[i] = 0;
+               else    d->rr_ttl[i] -= now;
+       }
+       if(d->ttl < now)
+               d->ttl = 0;
+       else    d->ttl -= now;
        return ck;
 }
 
index 274347f3b5d089a64af6b938c3bea2aa4d2d5a08..9f7a44372c6bf8b36717a6a5875f550a6997bd89 100644 (file)
@@ -337,8 +337,11 @@ val_verify_rrset(struct module_env* env, struct val_env* ve,
                if(sec == sec_status_secure)
                        d->trust = rrset_trust_validated;
                else if(sec == sec_status_bogus) {
+                       size_t i;
                        /* update ttl for rrset to fixed value. */
                        d->ttl = ve->bogus_ttl;
+                       for(i=0; i<d->count+d->rrsig_count; i++)
+                               d->rr_ttl[i] = ve->bogus_ttl;
                        /* leave RR specific TTL: not used for determine
                         * if RRset timed out and clients see proper value. */
                        lock_basic_lock(&ve->bogus_lock);