mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-09-01 15:05:23 +00:00
Add bindrdatasets() function that binds both rdatasets
This removes code duplication between the dual bindrdataset() calls. It also unifies the handling as there were small differences between the calls: one variant was checking for !NEGATIVE(found) condition and one wasn't, and it is technically ok to do the check for all variants.
This commit is contained in:
@@ -1142,6 +1142,20 @@ bindrdataset(qpcache_t *qpdb, qpcnode_t *node, dns_slabheader_t *header,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
bindrdatasets(qpcache_t *qpdb, qpcnode_t *qpnode, dns_slabheader_t *found,
|
||||||
|
dns_slabheader_t *foundsig, isc_stdtime_t now,
|
||||||
|
isc_rwlocktype_t nlocktype, isc_rwlocktype_t tlocktype,
|
||||||
|
dns_rdataset_t *rdataset,
|
||||||
|
dns_rdataset_t *sigrdataset DNS__DB_FLARG) {
|
||||||
|
bindrdataset(qpdb, qpnode, found, now, nlocktype, tlocktype,
|
||||||
|
rdataset DNS__DB_FLARG_PASS);
|
||||||
|
if (!NEGATIVE(found) && foundsig != NULL) {
|
||||||
|
bindrdataset(qpdb, qpnode, foundsig, now, nlocktype, tlocktype,
|
||||||
|
sigrdataset DNS__DB_FLARG_PASS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static isc_result_t
|
static isc_result_t
|
||||||
setup_delegation(qpc_search_t *search, dns_dbnode_t **nodep,
|
setup_delegation(qpc_search_t *search, dns_dbnode_t **nodep,
|
||||||
dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset,
|
dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset,
|
||||||
@@ -1174,15 +1188,10 @@ setup_delegation(qpc_search_t *search, dns_dbnode_t **nodep,
|
|||||||
isc_rwlock_t *nlock =
|
isc_rwlock_t *nlock =
|
||||||
&search->qpdb->buckets[node->locknum].lock;
|
&search->qpdb->buckets[node->locknum].lock;
|
||||||
NODE_RDLOCK(nlock, &nlocktype);
|
NODE_RDLOCK(nlock, &nlocktype);
|
||||||
bindrdataset(search->qpdb, node, search->zonecut_header,
|
bindrdatasets(search->qpdb, node, search->zonecut_header,
|
||||||
search->now, nlocktype, tlocktype,
|
search->zonecut_sigheader, search->now, nlocktype,
|
||||||
rdataset DNS__DB_FLARG_PASS);
|
tlocktype, rdataset,
|
||||||
if (sigrdataset != NULL && search->zonecut_sigheader != NULL) {
|
sigrdataset DNS__DB_FLARG_PASS);
|
||||||
bindrdataset(search->qpdb, node,
|
|
||||||
search->zonecut_sigheader, search->now,
|
|
||||||
nlocktype, tlocktype,
|
|
||||||
sigrdataset DNS__DB_FLARG_PASS);
|
|
||||||
}
|
|
||||||
NODE_UNLOCK(nlock, &nlocktype);
|
NODE_UNLOCK(nlock, &nlocktype);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1419,15 +1428,10 @@ find_deepest_zonecut(qpc_search_t *search, qpcnode_t *node,
|
|||||||
isc_rwlocktype_none DNS__DB_FLARG_PASS);
|
isc_rwlocktype_none DNS__DB_FLARG_PASS);
|
||||||
*nodep = (dns_dbnode_t *)node;
|
*nodep = (dns_dbnode_t *)node;
|
||||||
}
|
}
|
||||||
bindrdataset(search->qpdb, node, found, search->now,
|
bindrdatasets(search->qpdb, node, found, foundsig,
|
||||||
nlocktype, isc_rwlocktype_none,
|
search->now, nlocktype,
|
||||||
rdataset DNS__DB_FLARG_PASS);
|
isc_rwlocktype_none, rdataset,
|
||||||
if (foundsig != NULL) {
|
sigrdataset DNS__DB_FLARG_PASS);
|
||||||
bindrdataset(search->qpdb, node, foundsig,
|
|
||||||
search->now, nlocktype,
|
|
||||||
isc_rwlocktype_none,
|
|
||||||
sigrdataset DNS__DB_FLARG_PASS);
|
|
||||||
}
|
|
||||||
if (need_headerupdate(found, search->now) ||
|
if (need_headerupdate(found, search->now) ||
|
||||||
(foundsig != NULL &&
|
(foundsig != NULL &&
|
||||||
need_headerupdate(foundsig, search->now)))
|
need_headerupdate(foundsig, search->now)))
|
||||||
@@ -1542,13 +1546,9 @@ find_coveringnsec(qpc_search_t *search, const dns_name_t *name,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (found != NULL) {
|
if (found != NULL) {
|
||||||
bindrdataset(search->qpdb, node, found, search->now, nlocktype,
|
bindrdatasets(search->qpdb, node, found, foundsig, search->now,
|
||||||
isc_rwlocktype_none, rdataset DNS__DB_FLARG_PASS);
|
nlocktype, isc_rwlocktype_none, rdataset,
|
||||||
if (foundsig != NULL) {
|
sigrdataset DNS__DB_FLARG_PASS);
|
||||||
bindrdataset(search->qpdb, node, foundsig, search->now,
|
|
||||||
nlocktype, isc_rwlocktype_none,
|
|
||||||
sigrdataset DNS__DB_FLARG_PASS);
|
|
||||||
}
|
|
||||||
qpcnode_acquire(search->qpdb, node, nlocktype,
|
qpcnode_acquire(search->qpdb, node, nlocktype,
|
||||||
isc_rwlocktype_none DNS__DB_FLARG_PASS);
|
isc_rwlocktype_none DNS__DB_FLARG_PASS);
|
||||||
|
|
||||||
@@ -1847,19 +1847,16 @@ qpcache_find(dns_db_t *db, const dns_name_t *name, dns_dbversion_t *version,
|
|||||||
tlocktype DNS__DB_FLARG_PASS);
|
tlocktype DNS__DB_FLARG_PASS);
|
||||||
*nodep = (dns_dbnode_t *)node;
|
*nodep = (dns_dbnode_t *)node;
|
||||||
}
|
}
|
||||||
bindrdataset(search.qpdb, node, nsecheader, search.now,
|
bindrdatasets(search.qpdb, node, nsecheader, nsecsig,
|
||||||
nlocktype, tlocktype,
|
search.now, nlocktype, tlocktype,
|
||||||
rdataset DNS__DB_FLARG_PASS);
|
rdataset, sigrdataset DNS__DB_FLARG_PASS);
|
||||||
if (need_headerupdate(nsecheader, search.now)) {
|
if (need_headerupdate(nsecheader, search.now)) {
|
||||||
update = nsecheader;
|
update = nsecheader;
|
||||||
}
|
}
|
||||||
if (nsecsig != NULL) {
|
if (nsecsig != NULL &&
|
||||||
bindrdataset(search.qpdb, node, nsecsig,
|
need_headerupdate(nsecsig, search.now))
|
||||||
search.now, nlocktype, tlocktype,
|
{
|
||||||
sigrdataset DNS__DB_FLARG_PASS);
|
updatesig = nsecsig;
|
||||||
if (need_headerupdate(nsecsig, search.now)) {
|
|
||||||
updatesig = nsecsig;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
result = DNS_R_COVERINGNSEC;
|
result = DNS_R_COVERINGNSEC;
|
||||||
goto node_exit;
|
goto node_exit;
|
||||||
@@ -1891,19 +1888,16 @@ qpcache_find(dns_db_t *db, const dns_name_t *name, dns_dbversion_t *version,
|
|||||||
tlocktype DNS__DB_FLARG_PASS);
|
tlocktype DNS__DB_FLARG_PASS);
|
||||||
*nodep = (dns_dbnode_t *)node;
|
*nodep = (dns_dbnode_t *)node;
|
||||||
}
|
}
|
||||||
bindrdataset(search.qpdb, node, nsheader, search.now,
|
bindrdatasets(search.qpdb, node, nsheader, nssig,
|
||||||
nlocktype, tlocktype,
|
search.now, nlocktype, tlocktype,
|
||||||
rdataset DNS__DB_FLARG_PASS);
|
rdataset, sigrdataset DNS__DB_FLARG_PASS);
|
||||||
if (need_headerupdate(nsheader, search.now)) {
|
if (need_headerupdate(nsheader, search.now)) {
|
||||||
update = nsheader;
|
update = nsheader;
|
||||||
}
|
}
|
||||||
if (nssig != NULL) {
|
if (nssig != NULL &&
|
||||||
bindrdataset(search.qpdb, node, nssig,
|
need_headerupdate(nssig, search.now))
|
||||||
search.now, nlocktype, tlocktype,
|
{
|
||||||
sigrdataset DNS__DB_FLARG_PASS);
|
updatesig = nssig;
|
||||||
if (need_headerupdate(nssig, search.now)) {
|
|
||||||
updatesig = nssig;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
result = DNS_R_DELEGATION;
|
result = DNS_R_DELEGATION;
|
||||||
goto node_exit;
|
goto node_exit;
|
||||||
@@ -1954,18 +1948,15 @@ qpcache_find(dns_db_t *db, const dns_name_t *name, dns_dbversion_t *version,
|
|||||||
if (type != dns_rdatatype_any || result == DNS_R_NCACHENXDOMAIN ||
|
if (type != dns_rdatatype_any || result == DNS_R_NCACHENXDOMAIN ||
|
||||||
result == DNS_R_NCACHENXRRSET)
|
result == DNS_R_NCACHENXRRSET)
|
||||||
{
|
{
|
||||||
bindrdataset(search.qpdb, node, found, search.now, nlocktype,
|
bindrdatasets(search.qpdb, node, found, foundsig, search.now,
|
||||||
tlocktype, rdataset DNS__DB_FLARG_PASS);
|
nlocktype, tlocktype, rdataset,
|
||||||
|
sigrdataset DNS__DB_FLARG_PASS);
|
||||||
if (need_headerupdate(found, search.now)) {
|
if (need_headerupdate(found, search.now)) {
|
||||||
update = found;
|
update = found;
|
||||||
}
|
}
|
||||||
if (!NEGATIVE(found) && foundsig != NULL) {
|
if (foundsig != NULL && need_headerupdate(foundsig, search.now))
|
||||||
bindrdataset(search.qpdb, node, foundsig, search.now,
|
{
|
||||||
nlocktype, tlocktype,
|
updatesig = foundsig;
|
||||||
sigrdataset DNS__DB_FLARG_PASS);
|
|
||||||
if (need_headerupdate(foundsig, search.now)) {
|
|
||||||
updatesig = foundsig;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2139,12 +2130,8 @@ qpcache_findzonecut(dns_db_t *db, const dns_name_t *name, unsigned int options,
|
|||||||
*nodep = (dns_dbnode_t *)node;
|
*nodep = (dns_dbnode_t *)node;
|
||||||
}
|
}
|
||||||
|
|
||||||
bindrdataset(search.qpdb, node, found, search.now, nlocktype, tlocktype,
|
bindrdatasets(search.qpdb, node, found, foundsig, search.now, nlocktype,
|
||||||
rdataset DNS__DB_FLARG_PASS);
|
tlocktype, rdataset, sigrdataset DNS__DB_FLARG_PASS);
|
||||||
if (foundsig != NULL) {
|
|
||||||
bindrdataset(search.qpdb, node, foundsig, search.now, nlocktype,
|
|
||||||
tlocktype, sigrdataset DNS__DB_FLARG_PASS);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (need_headerupdate(found, search.now) ||
|
if (need_headerupdate(found, search.now) ||
|
||||||
(foundsig != NULL && need_headerupdate(foundsig, search.now)))
|
(foundsig != NULL && need_headerupdate(foundsig, search.now)))
|
||||||
@@ -2246,13 +2233,9 @@ qpcache_findrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (found != NULL) {
|
if (found != NULL) {
|
||||||
bindrdataset(qpdb, qpnode, found, now, nlocktype,
|
bindrdatasets(qpdb, qpnode, found, foundsig, now, nlocktype,
|
||||||
isc_rwlocktype_none, rdataset DNS__DB_FLARG_PASS);
|
isc_rwlocktype_none, rdataset,
|
||||||
if (!NEGATIVE(found) && foundsig != NULL) {
|
sigrdataset DNS__DB_FLARG_PASS);
|
||||||
bindrdataset(qpdb, qpnode, foundsig, now, nlocktype,
|
|
||||||
isc_rwlocktype_none,
|
|
||||||
sigrdataset DNS__DB_FLARG_PASS);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NODE_UNLOCK(nlock, &nlocktype);
|
NODE_UNLOCK(nlock, &nlocktype);
|
||||||
|
Reference in New Issue
Block a user