]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Make the database ownercase modifiable only via addrdataset()
authorOndřej Surý <ondrej@isc.org>
Sat, 13 Sep 2025 04:56:58 +0000 (06:56 +0200)
committerOndřej Surý <ondrej@isc.org>
Sat, 13 Sep 2025 04:56:58 +0000 (06:56 +0200)
Simplify the implementation around the database ownercase.  Remove the
dns_rdataset_setownercase() implementation for the slabheaders and only
allow setting ownercase on rdatalists and rdatasets.  The ownercase in
the database can now be set only with dns_db_addrdataset() by passing
rdataset with correctly set ownercase.

lib/dns/diff.c
lib/dns/qpzone.c
lib/dns/rdataslab.c
tests/dns/qpzone_test.c

index e49ef6e9a53b259f99cb2a9962b26fecbb0463c7..59040509f04b639304af85ed5f7904b8e9add9fd 100644 (file)
@@ -253,13 +253,6 @@ getownercase(dns_rdataset_t *rdataset, dns_name_t *name) {
        }
 }
 
-static void
-setownercase(dns_rdataset_t *rdataset, const dns_name_t *name) {
-       if (dns_rdataset_isassociated(rdataset)) {
-               dns_rdataset_setownercase(rdataset, name);
-       }
-}
-
 static const char *
 optotext(dns_diffop_t op) {
        switch (op) {
@@ -389,6 +382,7 @@ diff_apply(const dns_diff_t *diff, dns_db_t *db, dns_dbversion_t *ver,
                        dns_rdataset_init(&rds);
                        dns_rdataset_init(&ardataset);
                        dns_rdatalist_tordataset(&rdl, &rds);
+                       dns_rdataset_setownercase(&rds, name);
                        rds.trust = dns_trust_ultimate;
 
                        /*
@@ -424,11 +418,6 @@ diff_apply(const dns_diff_t *diff, dns_db_t *db, dns_dbversion_t *ver,
                                        dns_db_setsigningtime(db, &ardataset,
                                                              resign);
                                }
-                               if (op == DNS_DIFFOP_ADD ||
-                                   op == DNS_DIFFOP_ADDRESIGN)
-                               {
-                                       setownercase(&ardataset, name);
-                               }
                                if (op == DNS_DIFFOP_DEL ||
                                    op == DNS_DIFFOP_DELRESIGN)
                                {
@@ -457,11 +446,6 @@ diff_apply(const dns_diff_t *diff, dns_db_t *db, dns_dbversion_t *ver,
                                                      "update with no effect",
                                                      namebuf, classbuf);
                                }
-                               if (op == DNS_DIFFOP_ADD ||
-                                   op == DNS_DIFFOP_ADDRESIGN)
-                               {
-                                       setownercase(&ardataset, name);
-                               }
                                if (op == DNS_DIFFOP_DEL ||
                                    op == DNS_DIFFOP_DELRESIGN)
                                {
index 8c5d31adffbf2342675c42be66999cf9a9d15a18..bbaa16b6875729d6898a69928eaf0f09a322cfc5 100644 (file)
@@ -4661,6 +4661,8 @@ qpzone_addrdataset(dns_db_t *db, dns_dbnode_t *dbnode,
 
        newheader = (dns_slabheader_t *)region.base;
        dns_slabheader_reset(newheader, (dns_dbnode_t *)node);
+       dns_slabheader_setownercase(newheader, name);
+
        newheader->ttl = rdataset->ttl;
        if (rdataset->ttl == 0U) {
                DNS_SLABHEADER_SETATTR(newheader, DNS_SLABHEADERATTR_ZEROTTL);
index ee9b5f6a4c751ac0cd61c9412963eb39e200862f..f611da9fe4cd0c400f43f9c3ee51d34b4279b05d 100644 (file)
@@ -74,8 +74,6 @@ rdataset_expire(dns_rdataset_t *rdataset DNS__DB_FLARG);
 static void
 rdataset_clearprefetch(dns_rdataset_t *rdataset);
 static void
-rdataset_setownercase(dns_rdataset_t *rdataset, const dns_name_t *name);
-static void
 rdataset_getownercase(const dns_rdataset_t *rdataset, dns_name_t *name);
 static dns_slabheader_t *
 rdataset_getheader(const dns_rdataset_t *rdataset);
@@ -92,7 +90,6 @@ dns_rdatasetmethods_t dns_rdataslab_rdatasetmethods = {
        .settrust = rdataset_settrust,
        .expire = rdataset_expire,
        .clearprefetch = rdataset_clearprefetch,
-       .setownercase = rdataset_setownercase,
        .getownercase = rdataset_getownercase,
        .getheader = rdataset_getheader,
 };
@@ -1147,20 +1144,6 @@ rdataset_clearprefetch(dns_rdataset_t *rdataset) {
        dns_db_unlocknode(header->node, isc_rwlocktype_write);
 }
 
-static void
-rdataset_setownercase(dns_rdataset_t *rdataset, const dns_name_t *name) {
-       dns_slabheader_t *header = dns_rdataset_getheader(rdataset);
-
-       /* The case could be set just once for the same header */
-       if (CASESET(header)) {
-               return;
-       }
-
-       dns_db_locknode(header->node, isc_rwlocktype_write);
-       dns_slabheader_setownercase(header, name);
-       dns_db_unlocknode(header->node, isc_rwlocktype_write);
-}
-
 static void
 rdataset_getownercase(const dns_rdataset_t *rdataset, dns_name_t *name) {
        dns_slabheader_t *header = dns_rdataset_getheader(rdataset);
index ad3d5b972a65be4194038cdc8fd2cc63573995f5..ba2591bf176183ba963966096f87a923f145ea6f 100644 (file)
@@ -16,6 +16,7 @@
 #include <setjmp.h>
 #include <stdarg.h>
 #include <stddef.h>
+#include <stdint.h>
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
@@ -137,7 +138,7 @@ ownercase_test_one(const char *str1, const char *str2) {
        assert_int_equal(result, ISC_R_SUCCESS);
 
        /* Store the case from name1 */
-       dns_rdataset_setownercase(&rdataset, name1);
+       dns_slabheader_setownercase(&header, name1);
 
        assert_true(CASESET(&header));