]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
validator.c:check_signer now clones val->sigrdataset
authorMark Andrews <marka@isc.org>
Wed, 17 Nov 2021 02:09:03 +0000 (13:09 +1100)
committerEvan Hunt <each@isc.org>
Fri, 1 Aug 2025 02:21:32 +0000 (19:21 -0700)
Spurious validation failures were traced back to check_signer looping
over val->sigrdataset directly.  Cloning val->sigrdataset prevents
check_signer from interacting with callers that are also looping
over val->sigrdataset.

lib/dns/validator.c

index 2d044ccdfc5e704d9636b971175c9dcf442290ef..c3247cc2d8a1b8e9a39a265cfd2a5671068019e5 100644 (file)
@@ -1874,11 +1874,14 @@ check_signer(dns_validator_t *val, dns_rdata_t *keyrdata, uint16_t keyid,
        dns_rdata_rrsig_t sig;
        dst_key_t *dstkey = NULL;
        isc_result_t result = ISC_R_NOMORE;
+       dns_rdataset_t rdataset = DNS_RDATASET_INIT;
 
-       DNS_RDATASET_FOREACH (val->sigrdataset) {
+       dns_rdataset_clone(val->sigrdataset, &rdataset);
+
+       DNS_RDATASET_FOREACH (&rdataset) {
                dns_rdata_t rdata = DNS_RDATA_INIT;
 
-               dns_rdataset_current(val->sigrdataset, &rdata);
+               dns_rdataset_current(&rdataset, &rdata);
                result = dns_rdata_tostruct(&rdata, &sig, NULL);
                RUNTIME_CHECK(result == ISC_R_SUCCESS);
                if (keyid != sig.keyid || algorithm != sig.algorithm) {
@@ -1903,6 +1906,7 @@ check_signer(dns_validator_t *val, dns_rdata_t *keyrdata, uint16_t keyid,
        if (dstkey != NULL) {
                dst_key_free(&dstkey);
        }
+       dns_rdataset_disassociate(&rdataset);
 
        return result;
 }