From: Alessio Podda Date: Wed, 3 Sep 2025 21:43:04 +0000 (+0200) Subject: Add slabheader foreach macro X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4d82c2a78c3d445e183ff2b04513f2e41c0d886b;p=thirdparty%2Fbind9.git Add slabheader foreach macro --- diff --git a/lib/dns/include/dns/rdataslab.h b/lib/dns/include/dns/rdataslab.h index 8b6bd7ab041..41fb48055d2 100644 --- a/lib/dns/include/dns/rdataslab.h +++ b/lib/dns/include/dns/rdataslab.h @@ -70,6 +70,16 @@ struct dns_slabheader_proof { elt != NULL; \ elt = elt##_next, elt##_next = (elt != NULL) ? elt->next : NULL) + +/* clang-format off */ +#define SLABHEADER_FOREACH_SAFE(header, elt, link) \ + for (dns_slabheader_t *elt = (header), \ + *elt##_next = (elt != NULL) ? (elt)->link : NULL; \ + elt != NULL; \ + elt = elt##_next, \ + elt##_next = (elt != NULL) ? (elt)->link : NULL) +/* clang-format on */ + typedef struct dns_slabtop dns_slabtop_t; struct dns_slabtop { dns_slabtop_t *next; diff --git a/lib/dns/qpzone.c b/lib/dns/qpzone.c index 1c28adfb7d4..6aec4e4435a 100644 --- a/lib/dns/qpzone.c +++ b/lib/dns/qpzone.c @@ -1552,7 +1552,6 @@ qpzone_findrdataset(dns_db_t *db, dns_dbnode_t *dbnode, qpzonedb_t *qpdb = (qpzonedb_t *)db; qpznode_t *node = (qpznode_t *)dbnode; dns_slabheader_t *found = NULL, *foundsig = NULL; - uint32_t serial; qpz_version_t *version = (qpz_version_t *)dbversion; bool close_version = false; dns_typepair_t typepair, sigpair; @@ -1571,7 +1570,6 @@ qpzone_findrdataset(dns_db_t *db, dns_dbnode_t *dbnode, currentversion(db, (dns_dbversion_t **)&version); close_version = true; } - serial = version->serial; nlock = qpzone_get_lock(node); NODE_RDLOCK(nlock, &nlocktype); @@ -1584,29 +1582,31 @@ qpzone_findrdataset(dns_db_t *db, dns_dbnode_t *dbnode, } DNS_SLABTOP_FOREACH(top, node->data) { - dns_slabheader_t *header = top->header; - do { - if (header->serial <= serial && !IGNORE(header)) { - if (!EXISTS(header)) { - header = NULL; + dns_slabheader_t * candidate = NULL; + + SLABHEADER_FOREACH_SAFE(top->header, inner, down) { + if (inner->serial <= version->serial && + !IGNORE(inner)) + { + if (EXISTS(inner)) { + candidate = inner; } break; - } else { - header = header->down; - } - } while (header != NULL); - if (header != NULL) { + } + } + + if (candidate != NULL) { /* * We have an active, extant rdataset. If it's a * type we're looking for, remember it. */ - if (top->typepair == typepair) { - found = header; + if (candidate->typepair == typepair) { + found = candidate; if (foundsig != NULL) { break; } - } else if (top->typepair == sigpair) { - foundsig = header; + } else if (candidate->typepair == sigpair) { + foundsig = candidate; if (found != NULL) { break; }