]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
3356. [bug] Cap the TTL of signed RRsets when RRSIGs are
authorckb <ckb@isc.org>
Wed, 25 Jul 2012 22:32:14 +0000 (17:32 -0500)
committerckb <ckb@isc.org>
Wed, 25 Jul 2012 22:32:14 +0000 (17:32 -0500)
approaching their expiry, so they don't remain
in caches after expiry. [RT #26429]

14 files changed:
CHANGES
bin/named/query.c
bin/tests/system/dnssec/ns2/example.db.in
bin/tests/system/dnssec/ns2/sign.sh
bin/tests/system/dnssec/ns3/expired.example.db.in
bin/tests/system/dnssec/ns3/expiring.example.db.in
bin/tests/system/dnssec/ns3/sign.sh
bin/tests/system/dnssec/ns4/named3.conf [new file with mode: 0644]
bin/tests/system/dnssec/tests.sh
lib/dns/include/dns/rdataset.h
lib/dns/rdataset.c
lib/dns/tests/Makefile.in
lib/dns/tests/rdataset_test.c [new file with mode: 0644]
lib/dns/validator.c

diff --git a/CHANGES b/CHANGES
index 061fd3ffa2eda3fec45db6e959a4bae80c6e1c0d..e319987e67614e51e14018788f8933cd802dd359 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,7 @@
+3356.  [bug]           Cap the TTL of signed RRsets when RRSIGs are 
+                       approaching their expiry, so they don't remain
+                       in caches after expiry. [RT #26429]
+
        --- 9.7.7b1 released ---
 
 3354.  [func]          Improve OpenSSL error logging. [RT #29932]
index 910eb1b07e900f2f56243750dc3221ad18ad05dc..9816d46ab50cf71cc49b516bbc50440699adbf4b 100644 (file)
@@ -25,6 +25,7 @@
 
 #include <isc/hex.h>
 #include <isc/mem.h>
+#include <isc/serial.h>
 #include <isc/stats.h>
 #include <isc/util.h>
 
@@ -2351,12 +2352,16 @@ query_addcnamelike(ns_client_t *client, dns_name_t *qname, dns_name_t *tname,
  */
 static void
 mark_secure(ns_client_t *client, dns_db_t *db, dns_name_t *name,
-           isc_uint32_t ttl, dns_rdataset_t *rdataset,
+           dns_rdata_rrsig_t *rrsig, dns_rdataset_t *rdataset,
            dns_rdataset_t *sigrdataset)
 {
        isc_result_t result;
        dns_dbnode_t *node = NULL;
 
+       dns_clientinfomethods_t cm;
+       dns_clientinfo_t ci;
+       isc_stdtime_t now;      
+       
        rdataset->trust = dns_trust_secure;
        sigrdataset->trust = dns_trust_secure;
 
@@ -2366,17 +2371,10 @@ mark_secure(ns_client_t *client, dns_db_t *db, dns_name_t *name,
        result = dns_db_findnode(db, name, ISC_TRUE, &node);
        if (result != ISC_R_SUCCESS)
                return;
-       /*
-        * Bound the validated ttls then minimise.
-        */
-       if (sigrdataset->ttl > ttl)
-               sigrdataset->ttl = ttl;
-       if (rdataset->ttl > ttl)
-               rdataset->ttl = ttl;
-       if (rdataset->ttl > sigrdataset->ttl)
-               rdataset->ttl = sigrdataset->ttl;
-       else
-               sigrdataset->ttl = rdataset->ttl;
+               
+       isc_stdtime_get(&now);
+       dns_rdataset_trimttl(rdataset, sigrdataset, rrsig, now,
+                            client->view->acceptexpired);
 
        (void)dns_db_addrdataset(db, node, NULL, client->now, rdataset,
                                 0, NULL);
@@ -2501,8 +2499,7 @@ validate(ns_client_t *client, dns_db_t *db, dns_name_t *name,
                                   client->view->acceptexpired)) {
                                dst_key_free(&key);
                                dns_rdataset_disassociate(&keyrdataset);
-                               mark_secure(client, db, name,
-                                           rrsig.originalttl,
+                               mark_secure(client, db, name, &rrsig,
                                            rdataset, sigrdataset);
                                return (ISC_TRUE);
                        }
index 133d99012ab01c4335c6e3ee39266e3e87f2669f..e4f6ed02aae38bc6408021ccd27b49555b81e347 100644 (file)
@@ -138,3 +138,6 @@ ns.upper            A       10.53.0.3
 
 LOWER                  NS      NS.LOWER
 NS.LOWER               A       10.53.0.3
+
+expiring                 NS      ns.expiring
+ns.expiring              A       10.53.0.3
index f652766ff179cc4c8d1124bff6941fde30b1edc3..4a35dd5924d7818cfadc191b60ff66018485b9d1 100644 (file)
@@ -32,7 +32,8 @@ zonefile=example.db
 
 for subdomain in secure bogus dynamic keyless nsec3 optout nsec3-unknown \
     optout-unknown multiple rsasha256 rsasha512 kskonly update-nsec3 \
-    auto-nsec auto-nsec3 secure.below-cname ttlpatch expired upper lower
+    auto-nsec auto-nsec3 secure.below-cname ttlpatch expired expiring upper \
+    lower
 do
        cp ../ns3/dsset-$subdomain.example. .
 done
index 3f7d15bc25924daf75a60c2212e7c45427c0d64a..867db7f6f5522e7e35c61c96c19c1aaf79979dc0 100644 (file)
@@ -23,7 +23,9 @@ $TTL 300      ; 5 minutes
                                3600       ; minimum (1 hour)
                                )
                        NS      ns
+                       MX      10 mx
 ns                     A       10.53.0.3
+mx                     A       10.0.0.30
 
 a                      A       10.0.0.1
 b                      A       10.0.0.2
@@ -43,3 +45,5 @@ ns.nosoa              A       10.53.0.7
 
 normalthenrrsig                A       10.0.0.28
 rrsigonly              A       10.0.0.29
+
+
index a395a1370633aad49093219a63c3a2148614d133..c87d433b9105b389bf5bc127d97eb03259016b7d 100644 (file)
@@ -23,7 +23,9 @@ $TTL 300      ; 5 minutes
                                3600       ; minimum (1 hour)
                                )
                        NS      ns
+                       MX      10 mx
 ns                     A       10.53.0.3
+mx                     A       10.0.0.30
 
 a                      A       10.0.0.1
 b                      A       10.0.0.2
index 7e8f1706db6142ec79c35a5d00fd371c889cc1a6..ca1d37e92959afbc2c5326930c38b3a189b44eb8 100644 (file)
@@ -350,7 +350,8 @@ kskname=`$KEYGEN -q -r $RANDFILE $zone`
 zskname=`$KEYGEN -q -r $RANDFILE -f KSK $zone`
 cp $infile $zonefile
 $SIGNER -S -r $RANDFILE -e now+1mi -o $zone $zonefile > /dev/null 2>&1
-rm -f ${zskname}.private ${kskname}.private
+mv -f ${zskname}.private ${zskname}.private.moved
+mv -f ${kskname}.private ${kskname}.private.moved
 
 #
 # A zone where the signer's name has been forced to uppercase.
diff --git a/bin/tests/system/dnssec/ns4/named3.conf b/bin/tests/system/dnssec/ns4/named3.conf
new file mode 100644 (file)
index 0000000..057489f
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2011  Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/* $Id: named2.conf,v 1.3 2011/01/04 23:47:13 tbox Exp $ */
+
+// NS4
+
+controls { /* empty */ };
+
+options {
+       query-source address 10.53.0.4;
+       notify-source 10.53.0.4;
+       transfer-source 10.53.0.4;
+       port 5300;
+       pid-file "named.pid";
+       listen-on { 10.53.0.4; };
+       listen-on-v6 { none; };
+       recursion yes;
+       acache-enable yes;
+       dnssec-enable yes;
+       dnssec-validation auto;
+        bindkeys-file "managed.conf";
+        dnssec-accept-expired yes;
+};
+
+key rndc_key {
+        secret "1234abcd8765";
+        algorithm hmac-md5;
+};
+
+controls {
+        inet 10.53.0.4 port 9953 allow { any; } keys { rndc_key; };
+};
+
+zone "." {
+       type hint;
+       file "../../common/root.hint";
+};
index 870e10262c6710a78f95456524a4408d3e9082c3..0fc7e78633a30a0d487cf48f51c09e7135a5506c 100644 (file)
@@ -1339,5 +1339,104 @@ n=`expr $n + 1`
 if [ $ret != 0 ]; then echo "I:failed"; fi
 status=`expr $status + $ret`
 
+echo "I:testing TTL is capped at RRSIG expiry time ($n)"
+ret=0
+$RNDC -c ../common/rndc.conf -s 10.53.0.3 -p 9953 freeze expiring.example 2>&1 | sed 's/^/I:ns3 /'
+(
+cd ns3
+RANDFILE=../random.data
+for file in K*.moved; do
+  mv $file `basename $file .moved`
+done
+$SIGNER -S -r $RANDFILE -N increment -e now+1mi -o expiring.example expiring.example.db > /dev/null 2>&1
+) || ret=1
+$RNDC -c ../common/rndc.conf -s 10.53.0.3 -p 9953 reload expiring.example 2>&1 | sed 's/^/I:ns3 /'
+
+$RNDC -c ../common/rndc.conf -s 10.53.0.4 -p 9953 flush
+$DIG +noall +answer +dnssec +cd -p 5300 expiring.example soa @10.53.0.4 > dig.out.ns4.1.$n
+$DIG +noall +answer +dnssec -p 5300 expiring.example soa @10.53.0.4 > dig.out.ns4.2.$n
+ttls=`awk '{print $2}' dig.out.ns4.1.$n`
+ttls2=`awk '{print $2}' dig.out.ns4.2.$n`
+for ttl in $ttls; do
+    [ $ttl -eq 300 ] || ret=1
+done
+for ttl in $ttls2; do
+    [ $ttl -le 60 ] || ret=1
+done
+n=`expr $n + 1`
+if [ $ret != 0 ]; then echo "I:failed"; fi
+status=`expr $status + $ret`
+
+echo "I:testing TTL is capped at RRSIG expiry time for records in the additional section ($n)"
+ret=0
+$RNDC -c ../common/rndc.conf -s 10.53.0.4 -p 9953 flush
+$DIG +noall +additional +dnssec +cd -p 5300 expiring.example mx @10.53.0.4 > dig.out.ns4.1.$n
+$DIG +noall +additional +dnssec -p 5300 expiring.example mx @10.53.0.4 > dig.out.ns4.2.$n
+ttls=`awk '{print $2}' dig.out.ns4.1.$n`
+ttls2=`awk '{print $2}' dig.out.ns4.2.$n`
+for ttl in $ttls; do
+    [ $ttl -eq 300 ] || ret=1
+done
+for ttl in $ttls2; do
+    [ $ttl -le 60 ] || ret=1
+done
+n=`expr $n + 1`
+if [ $ret != 0 ]; then echo "I:failed"; fi
+status=`expr $status + $ret`
+
+cp ns4/named3.conf ns4/named.conf
+$RNDC -c ../common/rndc.conf -s 10.53.0.4 -p 9953 reconfig 2>&1 | sed 's/^/I:ns4 /'
+sleep 3
+
+echo "I:testing TTL of about to expire RRsets with dnssec-accept-expired yes; ($n)"
+ret=0
+$RNDC -c ../common/rndc.conf -s 10.53.0.4 -p 9953 flush
+$DIG +noall +answer +dnssec +cd -p 5300 expiring.example soa @10.53.0.4 > dig.out.ns4.1.$n
+$DIG +noall +answer +dnssec -p 5300 expiring.example soa @10.53.0.4 > dig.out.ns4.2.$n
+ttls=`awk '{print $2}' dig.out.ns4.1.$n`
+ttls2=`awk '{print $2}' dig.out.ns4.2.$n`
+for ttl in $ttls; do
+    [ $ttl -eq 300 ] || ret=1
+done
+for ttl in $ttls2; do
+    [ $ttl -le 120 -a $ttl -gt 60 ] || ret=1
+done
+n=`expr $n + 1`
+if [ $ret != 0 ]; then echo "I:failed"; fi
+status=`expr $status + $ret`
+
+echo "I:testing TTL of expired RRsets with dnssec-accept-expired yes; ($n)"
+ret=0
+$DIG +noall +answer +dnssec +cd -p 5300 expired.example soa @10.53.0.4 > dig.out.ns4.1.$n
+$DIG +noall +answer +dnssec -p 5300 expired.example soa @10.53.0.4 > dig.out.ns4.2.$n
+ttls=`awk '{print $2}' dig.out.ns4.1.$n`
+ttls2=`awk '{print $2}' dig.out.ns4.2.$n`
+for ttl in $ttls; do
+    [ $ttl -eq 300 ] || ret=1
+done
+for ttl in $ttls2; do
+    [ $ttl -le 120 -a $ttl -gt 60 ] || ret=1
+done
+n=`expr $n + 1`
+if [ $ret != 0 ]; then echo "I:failed"; fi
+status=`expr $status + $ret`
+
+echo "I:testing TTL is capped at RRSIG expiry time for records in the additional section with dnssec-accept-expired yes; ($n)"
+ret=0
+$RNDC -c ../common/rndc.conf -s 10.53.0.4 -p 9953 flush
+$DIG +noall +additional +dnssec +cd -p 5300 expiring.example mx @10.53.0.4 > dig.out.ns4.1.$n
+$DIG +noall +additional +dnssec -p 5300 expiring.example mx @10.53.0.4 > dig.out.ns4.2.$n
+ttls=`awk '{print $2}' dig.out.ns4.1.$n`
+ttls2=`awk '{print $2}' dig.out.ns4.2.$n`
+for ttl in $ttls; do
+    [ $ttl -eq 300 ] || ret=1
+done
+for ttl in $ttls2; do
+    [ $ttl -le 120  -a $ttl -gt 60 ] || ret=1
+done
+n=`expr $n + 1`
+if [ $ret != 0 ]; then echo "I:failed"; fi
+status=`expr $status + $ret`
+
 echo "I:exit status: $status"
 exit $status
index 9498a2c6cbf9d8e9086acd7b5f6a3a24a8d5a8bb..d01b5e9d52244770921346cacd1c0889e3c7d65d 100644 (file)
@@ -56,6 +56,7 @@
 #include <isc/stdtime.h>
 
 #include <dns/types.h>
+#include <dns/rdatastruct.h>
 
 ISC_LANG_BEGINDECLS
 
@@ -651,6 +652,25 @@ dns_rdataset_expire(dns_rdataset_t *rdataset);
  * Mark the rdataset to be expired in the backing database.
  */
 
+void
+dns_rdataset_trimttl(dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset,
+                     dns_rdata_rrsig_t *rrsig, isc_stdtime_t now,
+                     isc_boolean_t acceptexpired);
+/*%<
+ * Trim the ttl of 'rdataset' and 'sigrdataset' so that they will expire
+ * at or before 'rrsig->expiretime'.  If 'acceptexpired' is true and the
+ * signature has expired or will expire in the next 120 seconds, limit
+ * the ttl to be no more than 120 seconds.
+ *
+ * The ttl is further limited by the original ttl as stored in 'rrsig'
+ * and the original ttl values of 'rdataset' and 'sigrdataset'.
+ *
+ * Requires:
+ * \li 'rdataset' is a valid rdataset.
+ * \li 'sigrdataset' is a valid rdataset.
+ * \li 'rrsig' is non NULL.
+ */
+
 const char *
 dns_trust_totext(dns_trust_t trust);
 /*%<
index 8c865498ef377271b97cff4db59f0cc6d49fc94b..5524c4336b75df625492b8c91d3abd09ff5c71d8 100644 (file)
@@ -26,6 +26,7 @@
 #include <isc/buffer.h>
 #include <isc/mem.h>
 #include <isc/random.h>
+#include <isc/serial.h>
 #include <isc/util.h>
 
 #include <dns/name.h>
@@ -772,3 +773,30 @@ dns_rdataset_expire(dns_rdataset_t *rdataset) {
        if (rdataset->methods->expire != NULL)
                (rdataset->methods->expire)(rdataset);
 }
+
+void
+dns_rdataset_trimttl(dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset,
+                    dns_rdata_rrsig_t *rrsig, isc_stdtime_t now,
+                    isc_boolean_t acceptexpired)
+{
+       isc_uint32_t ttl = 0;
+
+       REQUIRE(DNS_RDATASET_VALID(rdataset));
+       REQUIRE(DNS_RDATASET_VALID(sigrdataset));
+       REQUIRE(rrsig != NULL);
+
+       /*
+        * If we accept expired RRsets keep them for no more than 120 seconds.
+        */
+        if (acceptexpired &&
+            (isc_serial_le(rrsig->timeexpire, ((now + 120) & 0xffffffff)) ||
+             isc_serial_le(rrsig->timeexpire, now)))
+                ttl = 120;
+        else if (isc_serial_ge(rrsig->timeexpire, now))
+                ttl = rrsig->timeexpire - now;
+       
+        ttl = ISC_MIN(ISC_MIN(rdataset->ttl, sigrdataset->ttl),
+                      ISC_MIN(rrsig->originalttl, ttl));
+        rdataset->ttl = ttl;
+        sigrdataset->ttl = ttl;
+}
index fc1d383cd90b8d25f0e47d1a15440d5929f1916a..1f0056eb9a8012791f34a3495edc5211d3ae2eb6 100644 (file)
@@ -37,12 +37,14 @@ DNSDEPLIBS =        ../libdns.@A@
 LIBS =         @LIBS@ @ATFLIBS@
 
 OBJS =         dnstest.@O@
+<<<<<<< HEAD
 SRCS =         dnstest.c master_test.c time_test.c dbiterator_test.c \
-               dbversion_test.c zonemgr_test.c nsec3_test.c
+               dbversion_test.c zonemgr_test.c nsec3_test.c rdataset_test.c
 
 SUBDIRS =
 TARGETS =      master_test@EXEEXT@ time_test@EXEEXT@ dbiterator_test@EXEEXT@ \
-               dbversion_test@EXEEXT@ zonemgr_test@EXEEXT@ nsec3_test@EXEEXT@
+               dbversion_test@EXEEXT@ zonemgr_test@EXEEXT@ nsec3_test@EXEEXT@ \
+               rdataset_test@EXEEXT@
 
 @BIND9_MAKE_RULES@
 
@@ -75,6 +77,11 @@ nsec3_test@EXEEXT@: nsec3_test.@O@ dnstest.@O@ ${ISCDEPLIBS} ${DNSDEPLIBS}
        ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
                        nsec3_test.@O@ dnstest.@O@ ${DNSLIBS} \
                                ${ISCLIBS} ${LIBS}
+                               
+rdataset_test@EXEEXT@: rdataset_test.@O@ dnstest.@O@ ${ISCDEPLIBS} ${DNSDEPLIBS}
+       ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
+                       rdataset_test.@O@ dnstest.@O@ ${DNSLIBS} \
+                               ${ISCLIBS} ${LIBS}
 
 unit::
        sh ${top_srcdir}/unit/unittest.sh
diff --git a/lib/dns/tests/rdataset_test.c b/lib/dns/tests/rdataset_test.c
new file mode 100644 (file)
index 0000000..a7bd224
--- /dev/null
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2011, 2012  Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/* $Id$ */
+
+/*! \file */
+
+#include <config.h>
+
+#include <atf-c.h>
+
+#include <unistd.h>
+
+#include <dns/rdataset.h>
+#include <dns/rdatastruct.h>
+
+#include "dnstest.h"
+
+
+/*
+ * Individual unit tests
+ */
+
+/* Successful load test */
+ATF_TC(trimttl);
+ATF_TC_HEAD(trimttl, tc) {
+       atf_tc_set_md_var(tc, "descr", "dns_master_loadfile() loads a "
+                                      "valid master file and returns success");
+}
+ATF_TC_BODY(trimttl, tc) {
+       isc_result_t result;
+       dns_rdataset_t rdataset, sigrdataset;
+       dns_rdata_rrsig_t rrsig;
+       isc_stdtime_t ttltimenow, ttltimeexpire;
+
+       ttltimenow = 10000000;
+       ttltimeexpire = ttltimenow + 800;
+
+       UNUSED(tc);
+
+       dns_rdataset_init(&rdataset);
+       dns_rdataset_init(&sigrdataset);
+
+       result = dns_test_begin(NULL, ISC_FALSE);
+       ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+
+       rdataset.ttl = 900;
+       sigrdataset.ttl = 1000;
+       rrsig.timeexpire = ttltimeexpire;
+       rrsig.originalttl = 1000;
+
+       dns_rdataset_trimttl(&rdataset, &sigrdataset, &rrsig, ttltimenow,
+                            ISC_TRUE);
+       ATF_REQUIRE_EQ(rdataset.ttl, 800);
+       ATF_REQUIRE_EQ(sigrdataset.ttl, 800);
+
+       rdataset.ttl = 900;
+       sigrdataset.ttl = 1000;
+       rrsig.timeexpire = ttltimenow - 200;
+       rrsig.originalttl = 1000;
+
+       dns_rdataset_trimttl(&rdataset, &sigrdataset, &rrsig, ttltimenow,
+                            ISC_TRUE);
+       ATF_REQUIRE_EQ(rdataset.ttl, 120);
+       ATF_REQUIRE_EQ(sigrdataset.ttl, 120);
+
+       rdataset.ttl = 900;
+       sigrdataset.ttl = 1000;
+       rrsig.timeexpire = ttltimenow - 200;
+       rrsig.originalttl = 1000;
+
+       dns_rdataset_trimttl(&rdataset, &sigrdataset, &rrsig, ttltimenow,
+                            ISC_FALSE);
+       ATF_REQUIRE_EQ(rdataset.ttl, 0);
+       ATF_REQUIRE_EQ(sigrdataset.ttl, 0);
+
+       sigrdataset.ttl = 900;
+       rdataset.ttl = 1000;
+       rrsig.timeexpire = ttltimeexpire;
+       rrsig.originalttl = 1000;
+
+       dns_rdataset_trimttl(&rdataset, &sigrdataset, &rrsig, ttltimenow,
+                            ISC_TRUE);
+       ATF_REQUIRE_EQ(rdataset.ttl, 800);
+       ATF_REQUIRE_EQ(sigrdataset.ttl, 800);
+
+       sigrdataset.ttl = 900;
+       rdataset.ttl = 1000;
+       rrsig.timeexpire = ttltimenow - 200;
+       rrsig.originalttl = 1000;
+
+       dns_rdataset_trimttl(&rdataset, &sigrdataset, &rrsig, ttltimenow,
+                            ISC_TRUE);
+       ATF_REQUIRE_EQ(rdataset.ttl, 120);
+       ATF_REQUIRE_EQ(sigrdataset.ttl, 120);
+
+       sigrdataset.ttl = 900;
+       rdataset.ttl = 1000;
+       rrsig.timeexpire = ttltimenow - 200;
+       rrsig.originalttl = 1000;
+
+       dns_rdataset_trimttl(&rdataset, &sigrdataset, &rrsig, ttltimenow,
+                            ISC_FALSE);
+       ATF_REQUIRE_EQ(rdataset.ttl, 0);
+       ATF_REQUIRE_EQ(sigrdataset.ttl, 0);
+
+       dns_test_end();
+}
+
+/*
+ * Main
+ */
+ATF_TP_ADD_TCS(tp) {
+       ATF_TP_ADD_TC(tp, trimttl);
+
+       return (atf_no_error());
+}
+
index 8644ad59142be53907e879c8a644ba56fba22467..d60f62af8d71f6a6207b5369eceef6f7ffdd596e 100644 (file)
@@ -2067,15 +2067,13 @@ validate(dns_validator_t *val, isc_boolean_t resume) {
                        validator_log(val, ISC_LOG_DEBUG(3),
                                      "failed to verify rdataset");
                else {
-                       isc_uint32_t ttl;
                        isc_stdtime_t now;
 
                        isc_stdtime_get(&now);
-                       ttl = ISC_MIN(event->rdataset->ttl,
-                                     ISC_MIN(val->siginfo->originalttl,
-                                             val->siginfo->timeexpire - now));
-                       event->rdataset->ttl = ttl;
-                       event->sigrdataset->ttl = ttl;
+                       dns_rdataset_trimttl(event->rdataset,
+                                            event->sigrdataset,
+                                            val->siginfo, now,
+                                            val->view->acceptexpired);
                }
 
                if (val->keynode != NULL)