]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Fix inconsistencies in inline signing time comparisons (#42112)
authorMukund Sivaraman <muks@isc.org>
Fri, 21 Apr 2017 11:10:34 +0000 (16:40 +0530)
committerMukund Sivaraman <muks@isc.org>
Fri, 21 Apr 2017 11:13:58 +0000 (16:43 +0530)
CHANGES
lib/dns/rbtdb.c

diff --git a/CHANGES b/CHANGES
index 355eec2d751e3f7ffbb5c0b77dae31ec9e61149d..cacf419769b77af6b062bc66a2aab938766b1a99 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,8 @@
+4599.  [bug]           Fix inconsistencies in inline signing time
+                       comparison that were introduced with the
+                       introduction of rdatasetheader->resign_lsb.
+                       [RT #42112]
+
 4598.  [func]          Update fuzzing code to (1) reply to a DNSKEY
                        query from named with appropriate DNSKEY used in
                        fuzzing; (2) patch the QTYPE correctly in
index c8f0167ee1e8652b3bd2eb71e42525d9559b89a4..f17a12a3540895056f58ae6259844f262f5c6b4b 100644 (file)
@@ -662,7 +662,7 @@ struct dns_rbtdb {
         * context to use for the heap (which differs from the main
         * database memory context in the case of a cache).
         */
-       isc_mem_t *                     hmctx;
+       isc_mem_t                       *hmctx;
        isc_heap_t                      **heaps;
 
        /*
@@ -1076,9 +1076,7 @@ ttl_sooner(void *v1, void *v2) {
        rdatasetheader_t *h1 = v1;
        rdatasetheader_t *h2 = v2;
 
-       if (h1->rdh_ttl < h2->rdh_ttl)
-               return (ISC_TRUE);
-       return (ISC_FALSE);
+       return (ISC_TF(h1->rdh_ttl < h2->rdh_ttl));
 }
 
 static isc_boolean_t
@@ -1086,10 +1084,9 @@ resign_sooner(void *v1, void *v2) {
        rdatasetheader_t *h1 = v1;
        rdatasetheader_t *h2 = v2;
 
-       if (h1->resign < h2->resign ||
-           (h1->resign == h2->resign && h1->resign_lsb < h2->resign_lsb))
-               return (ISC_TRUE);
-       return (ISC_FALSE);
+       return (ISC_TF(h1->resign < h2->resign ||
+                      (h1->resign == h2->resign &&
+                       h1->resign_lsb < h2->resign_lsb)));
 }
 
 /*%
@@ -6172,7 +6169,8 @@ add32(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, rbtdb_version_t *rbtversion,
                                update_newheader(newheader, header);
                                if (loading && RESIGN(newheader) &&
                                    RESIGN(header) &&
-                                   header->resign < newheader->resign) {
+                                   resign_sooner(header, newheader))
+                               {
                                        newheader->resign = header->resign;
                                        newheader->resign_lsb =
                                                        header->resign_lsb;
@@ -7253,7 +7251,9 @@ rbt_datafixer(dns_rbtnode_t *rbtnode, void *base, size_t filesize,
                header->node = rbtnode;
                header->node_is_relative = 0;
 
-               if (rbtdb != NULL && RESIGN(header) && header->resign != 0) {
+               if (rbtdb != NULL && RESIGN(header) &&
+                   (header->resign != 0 || header->resign_lsb != 0))
+               {
                        int idx = header->node->locknum;
                        result = isc_heap_insert(rbtdb->heaps[idx], header);
                        if (result != ISC_R_SUCCESS)
@@ -7889,7 +7889,7 @@ setsigningtime(dns_db_t *db, dns_rdataset_t *rdataset, isc_stdtime_t resign) {
        NODE_LOCK(&rbtdb->node_locks[header->node->locknum].lock,
                  isc_rwlocktype_write);
 
-       oldresign = header->resign;
+       oldresign = (header->resign << 1) | header->resign_lsb;
        header->resign = (isc_stdtime_t)(dns_time64_from32(resign) >> 1);
        header->resign_lsb = resign & 0x1;
        if (header->heap_index != 0) {
@@ -7937,7 +7937,7 @@ getsigningtime(dns_db_t *db, dns_rdataset_t *rdataset,
                }
                if (header == NULL)
                        header = this;
-               else if (isc_serial_lt(this->resign, header->resign)) {
+               else if (resign_sooner(this, header)) {
                        locknum = header->node->locknum;
                        NODE_UNLOCK(&rbtdb->node_locks[locknum].lock,
                                    isc_rwlocktype_read);