]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Restore the .ttl field for slabheader in dns_qpzone
authorOndřej Surý <ondrej@isc.org>
Mon, 3 Feb 2025 13:06:37 +0000 (14:06 +0100)
committerOndřej Surý <ondrej@isc.org>
Mon, 3 Feb 2025 13:39:06 +0000 (14:39 +0100)
The original .ttl field was actually used as TTL in the dns_qpzone unit.
Restore the field by adding it to union with the .expire struct member
and cleanup all the code that added or subtracted 'now' from the ttl
field as that was misleading as 'now' would be always 0 for qpzone
database.

lib/dns/include/dns/rdataslab.h
lib/dns/qpzone.c

index ff2057808f4b0cc3e3d9c13c20218098680dfdb2..cf2c8f1567db492147105680d76c538c2255b6cc 100644 (file)
@@ -70,9 +70,12 @@ struct dns_slabheader {
        /*%
         * Locked by the owning node's lock.
         */
-       dns_trust_t    trust;
-       uint32_t       serial;
-       isc_stdtime_t  expire;
+       dns_trust_t trust;
+       uint32_t    serial;
+       union {
+               isc_stdtime_t expire;
+               dns_ttl_t     ttl;
+       };
        dns_typepair_t type;
 
        _Atomic(uint16_t) count;
index 9771163fdc7cd0cf42de86ffbab4fd99fbeef9ce..43160741e2a5f71bde58fbd81a25961973ec6e95 100644 (file)
@@ -265,7 +265,6 @@ typedef struct {
        dns_slabheader_t *zonecut_header;
        dns_slabheader_t *zonecut_sigheader;
        dns_fixedname_t zonecut_name;
-       isc_stdtime_t now;
 } qpz_search_t;
 
 /*%
@@ -273,7 +272,6 @@ typedef struct {
  */
 typedef struct {
        dns_db_t *db;
-       isc_stdtime_t now;
        dns_qp_t *tree;
        dns_qp_t *nsec;
        dns_qp_t *nsec3;
@@ -972,7 +970,7 @@ unref:
 
 static void
 bindrdataset(qpzonedb_t *qpdb, qpznode_t *node, dns_slabheader_t *header,
-            isc_stdtime_t now, dns_rdataset_t *rdataset DNS__DB_FLARG) {
+            dns_rdataset_t *rdataset DNS__DB_FLARG) {
        if (rdataset == NULL) {
                return;
        }
@@ -985,7 +983,7 @@ bindrdataset(qpzonedb_t *qpdb, qpznode_t *node, dns_slabheader_t *header,
        rdataset->rdclass = qpdb->common.rdclass;
        rdataset->type = DNS_TYPEPAIR_TYPE(header->type);
        rdataset->covers = DNS_TYPEPAIR_COVERS(header->type);
-       rdataset->ttl = header->expire - now;
+       rdataset->ttl = header->ttl;
        rdataset->trust = header->trust;
 
        if (OPTOUT(header)) {
@@ -1622,9 +1620,9 @@ qpzone_findrdataset(dns_db_t *db, dns_dbnode_t *dbnode,
                }
        }
        if (found != NULL) {
-               bindrdataset(qpdb, node, found, 0, rdataset DNS__DB_FLARG_PASS);
+               bindrdataset(qpdb, node, found, rdataset DNS__DB_FLARG_PASS);
                if (foundsig != NULL) {
-                       bindrdataset(qpdb, node, foundsig, 0,
+                       bindrdataset(qpdb, node, foundsig,
                                     sigrdataset DNS__DB_FLARG_PASS);
                }
        }
@@ -1827,7 +1825,7 @@ static isc_result_t
 add(qpzonedb_t *qpdb, qpznode_t *node, const dns_name_t *nodename,
     qpz_version_t *version, dns_slabheader_t *newheader, unsigned int options,
     bool loading, dns_rdataset_t *addedrdataset,
-    isc_stdtime_t now DNS__DB_FLARG) {
+    isc_stdtime_t now ISC_ATTR_UNUSED DNS__DB_FLARG) {
        qpz_changed_t *changed = NULL;
        dns_slabheader_t *topheader = NULL, *topheader_prev = NULL;
        dns_slabheader_t *prioheader = NULL;
@@ -1890,10 +1888,10 @@ add(qpzonedb_t *qpdb, qpznode_t *node, const dns_name_t *nodename,
                                flags |= DNS_RDATASLAB_EXACT;
                        }
                        if ((options & DNS_DBADD_EXACTTTL) != 0 &&
-                           newheader->expire != header->expire)
+                           newheader->ttl != header->ttl)
                        {
                                result = DNS_R_NOTEXACT;
-                       } else if (newheader->expire != header->expire) {
+                       } else if (newheader->ttl != header->ttl) {
                                flags |= DNS_RDATASLAB_FORCE;
                        }
                        if (result == ISC_R_SUCCESS) {
@@ -2064,7 +2062,7 @@ add(qpzonedb_t *qpdb, qpznode_t *node, const dns_name_t *nodename,
        }
 
        if (addedrdataset != NULL) {
-               bindrdataset(qpdb, node, newheader, now,
+               bindrdataset(qpdb, node, newheader,
                             addedrdataset DNS__DB_FLARG_PASS);
        }
 
@@ -2181,7 +2179,7 @@ loading_addrdataset(void *arg, const dns_name_t *name,
        newheader = (dns_slabheader_t *)region.base;
        *newheader = (dns_slabheader_t){
                .type = DNS_TYPEPAIR_VALUE(rdataset->type, rdataset->covers),
-               .expire = rdataset->ttl + loadctx->now,
+               .ttl = rdataset->ttl,
                .trust = rdataset->trust,
                .node = (dns_dbnode_t *)node,
                .serial = 1,
@@ -2667,10 +2665,10 @@ qpzone_setup_delegation(qpz_search_t *search, dns_dbnode_t **nodep,
                isc_rwlock_t *nlock = &search->qpdb->node_locks[node->locknum];
                NODE_RDLOCK(nlock, &nlocktype);
                bindrdataset(search->qpdb, node, search->zonecut_header,
-                            search->now, rdataset DNS__DB_FLARG_PASS);
+                            rdataset DNS__DB_FLARG_PASS);
                if (sigrdataset != NULL && search->zonecut_sigheader != NULL) {
                        bindrdataset(search->qpdb, node,
-                                    search->zonecut_sigheader, search->now,
+                                    search->zonecut_sigheader,
                                     sigrdataset DNS__DB_FLARG_PASS);
                }
                NODE_UNLOCK(nlock, &nlocktype);
@@ -3155,12 +3153,12 @@ again:
                                        *nodep = (dns_dbnode_t *)node;
                                }
                                bindrdataset(search->qpdb, node, found,
-                                            search->now,
+
                                             rdataset DNS__DB_FLARG_PASS);
                                if (foundsig != NULL) {
                                        bindrdataset(
                                                search->qpdb, node, foundsig,
-                                               search->now,
+
                                                sigrdataset DNS__DB_FLARG_PASS);
                                }
                        } else if (found == NULL && foundsig == NULL) {
@@ -3758,10 +3756,10 @@ found:
                        *nodep = (dns_dbnode_t *)node;
                }
                if (search.version->secure && !search.version->havensec3) {
-                       bindrdataset(search.qpdb, node, nsecheader, 0,
+                       bindrdataset(search.qpdb, node, nsecheader,
                                     rdataset DNS__DB_FLARG_PASS);
                        if (nsecsig != NULL) {
-                               bindrdataset(search.qpdb, node, nsecsig, 0,
+                               bindrdataset(search.qpdb, node, nsecsig,
                                             sigrdataset DNS__DB_FLARG_PASS);
                        }
                }
@@ -3826,10 +3824,10 @@ found:
        }
 
        if (type != dns_rdatatype_any) {
-               bindrdataset(search.qpdb, node, found, 0,
+               bindrdataset(search.qpdb, node, found,
                             rdataset DNS__DB_FLARG_PASS);
                if (foundsig != NULL) {
-                       bindrdataset(search.qpdb, node, foundsig, 0,
+                       bindrdataset(search.qpdb, node, foundsig,
                                     sigrdataset DNS__DB_FLARG_PASS);
                }
        }
@@ -4186,8 +4184,7 @@ rdatasetiter_current(dns_rdatasetiter_t *iterator,
 
        NODE_RDLOCK(nlock, &nlocktype);
 
-       bindrdataset(qpdb, node, header, qrditer->common.now,
-                    rdataset DNS__DB_FLARG_PASS);
+       bindrdataset(qpdb, node, header, rdataset DNS__DB_FLARG_PASS);
 
        NODE_UNLOCK(nlock, &nlocktype);
 }
@@ -4687,7 +4684,7 @@ qpzone_addrdataset(dns_db_t *db, dns_dbnode_t *dbnode,
        };
 
        dns_slabheader_reset(newheader, db, (dns_dbnode_t *)node);
-       newheader->expire = rdataset->ttl;
+       newheader->ttl = rdataset->ttl;
        if (rdataset->ttl == 0U) {
                DNS_SLABHEADER_SETATTR(newheader, DNS_SLABHEADERATTR_ZEROTTL);
        }
@@ -4802,7 +4799,7 @@ qpzone_subtractrdataset(dns_db_t *db, dns_dbnode_t *dbnode,
 
        newheader = (dns_slabheader_t *)region.base;
        dns_slabheader_reset(newheader, db, (dns_dbnode_t *)node);
-       newheader->expire = rdataset->ttl;
+       newheader->ttl = rdataset->ttl;
        newheader->type = DNS_TYPEPAIR_VALUE(rdataset->type, rdataset->covers);
        atomic_init(&newheader->attributes, 0);
        newheader->serial = version->serial;
@@ -4852,7 +4849,7 @@ qpzone_subtractrdataset(dns_db_t *db, dns_dbnode_t *dbnode,
                result = ISC_R_SUCCESS;
                if ((options & DNS_DBSUB_EXACT) != 0) {
                        flags |= DNS_RDATASLAB_EXACT;
-                       if (newheader->expire != header->expire) {
+                       if (newheader->ttl != header->ttl) {
                                result = DNS_R_NOTEXACT;
                        }
                }
@@ -4899,7 +4896,7 @@ qpzone_subtractrdataset(dns_db_t *db, dns_dbnode_t *dbnode,
                        dns_slabheader_destroy(&newheader);
                        newheader = dns_slabheader_new((dns_db_t *)qpdb,
                                                       (dns_dbnode_t *)node);
-                       newheader->expire = 0;
+                       newheader->ttl = 0;
                        newheader->type = topheader->type;
                        atomic_init(&newheader->attributes,
                                    DNS_SLABHEADERATTR_NONEXISTENT);
@@ -4941,14 +4938,14 @@ qpzone_subtractrdataset(dns_db_t *db, dns_dbnode_t *dbnode,
        }
 
        if (result == ISC_R_SUCCESS && newrdataset != NULL) {
-               bindrdataset(qpdb, node, newheader, 0,
+               bindrdataset(qpdb, node, newheader,
                             newrdataset DNS__DB_FLARG_PASS);
        }
 
        if (result == DNS_R_NXRRSET && newrdataset != NULL &&
            (options & DNS_DBSUB_WANTOLD) != 0)
        {
-               bindrdataset(qpdb, node, header, 0,
+               bindrdataset(qpdb, node, header,
                             newrdataset DNS__DB_FLARG_PASS);
        }
 
@@ -4983,7 +4980,7 @@ qpzone_deleterdataset(dns_db_t *db, dns_dbnode_t *dbnode,
 
        newheader = dns_slabheader_new(db, (dns_dbnode_t *)node);
        newheader->type = DNS_TYPEPAIR_VALUE(type, covers);
-       newheader->expire = 0;
+       newheader->ttl = 0;
        atomic_init(&newheader->attributes, DNS_SLABHEADERATTR_NONEXISTENT);
        newheader->serial = version->serial;