]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Handle dns_rdata_fromstruct failure dns_keytable_deletekey
authorMark Andrews <marka@isc.org>
Tue, 29 Nov 2022 05:07:39 +0000 (16:07 +1100)
committerPetr Špaček <pspacek@isc.org>
Mon, 3 Apr 2023 15:43:43 +0000 (17:43 +0200)
dns_rdata_fromstruct in dns_keytable_deletekey can potentially
fail with ISC_R_NOSPACE.  Handle the error condition.

lib/dns/keytable.c

index 589ce1190fb5eed16a205ca0db646125122a5876..a4acc89098ef277825a81bb059dbe8b8701f2fea 100644 (file)
@@ -460,10 +460,6 @@ dns_keytable_deletekey(dns_keytable_t *keytable, const dns_name_t *keyname,
        REQUIRE(VALID_KEYTABLE(keytable));
        REQUIRE(dnskey != NULL);
 
-       isc_buffer_init(&b, data, sizeof(data));
-       dns_rdata_fromstruct(&rdata, dnskey->common.rdclass,
-                            dns_rdatatype_dnskey, dnskey, &b);
-
        RWLOCK(&keytable->rwlock, isc_rwlocktype_write);
        result = dns_rbt_findnode(keytable->table, keyname, NULL, &node, NULL,
                                  DNS_RBTFIND_NOOPTIONS, NULL, NULL);
@@ -490,6 +486,13 @@ dns_keytable_deletekey(dns_keytable_t *keytable, const dns_name_t *keyname,
        }
        RWUNLOCK(&knode->rwlock, isc_rwlocktype_read);
 
+       isc_buffer_init(&b, data, sizeof(data));
+       result = dns_rdata_fromstruct(&rdata, dnskey->common.rdclass,
+                                     dns_rdatatype_dnskey, dnskey, &b);
+       if (result != ISC_R_SUCCESS) {
+               goto finish;
+       }
+
        result = dns_ds_fromkeyrdata(keyname, &rdata, DNS_DSDIGEST_SHA256,
                                     digest, &ds);
        if (result != ISC_R_SUCCESS) {