From: Ondřej Surý Date: Sat, 13 Sep 2025 04:56:58 +0000 (+0200) Subject: Make the database ownercase modifiable only via addrdataset() X-Git-Tag: v9.21.14~46^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a8c3661e2b06d677dced772d5ed5e96a591331da;p=thirdparty%2Fbind9.git Make the database ownercase modifiable only via addrdataset() 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. --- diff --git a/lib/dns/diff.c b/lib/dns/diff.c index e49ef6e9a53..59040509f04 100644 --- a/lib/dns/diff.c +++ b/lib/dns/diff.c @@ -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) { diff --git a/lib/dns/qpzone.c b/lib/dns/qpzone.c index 8c5d31adffb..bbaa16b6875 100644 --- a/lib/dns/qpzone.c +++ b/lib/dns/qpzone.c @@ -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); diff --git a/lib/dns/rdataslab.c b/lib/dns/rdataslab.c index ee9b5f6a4c7..f611da9fe4c 100644 --- a/lib/dns/rdataslab.c +++ b/lib/dns/rdataslab.c @@ -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); diff --git a/tests/dns/qpzone_test.c b/tests/dns/qpzone_test.c index ad3d5b972a6..ba2591bf176 100644 --- a/tests/dns/qpzone_test.c +++ b/tests/dns/qpzone_test.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -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));