]> 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:48:31 +0000 (17:48 +0200)
dns_rdata_fromstruct in dns_keytable_deletekey can potentially
fail with ISC_R_NOSPACE.  Handle the error condition.

(cherry picked from commit b5df9b8591875c00f280d7687ff11430133a36ba)

lib/dns/keytable.c

index 7899124c900fa6feac9f9fb6a1e68cad6a56a825..e5786f1388a6be9461737296903ba8b4449751ac 100644 (file)
@@ -459,10 +459,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);
@@ -489,6 +485,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) {