]> git.ipfire.org Git - thirdparty/ldns.git/commitdiff
bugfix #117: drill -S . assert failues
authorWillem Toorop <willem@nlnetlabs.nl>
Wed, 27 Jan 2021 10:41:00 +0000 (11:41 +0100)
committerWillem Toorop <willem@nlnetlabs.nl>
Wed, 27 Jan 2021 10:41:00 +0000 (11:41 +0100)
Assertion failure with DNSSEC validating of non existence of RR types at the root.
Thanks ZjYwMj

Changelog
dnssec_verify.c

index 4af6207acb51d68124933b5a88905918854e0921..5ade564aa50fa0ead4bfc7f7f94e7b1c33504fa5 100644 (file)
--- a/Changelog
+++ b/Changelog
@@ -17,7 +17,9 @@
          if they arrive within 100msec of each other.
        * Fix so that ldns-testns does not leak sockets if the read fails.
        * SVCB and HTTPS draft rrtypes.
-         Enable with --enable-rrtype-svcb-https
+         Enable with --enable-rrtype-svcb-https.
+       * bugfix #117: Assertion failure with DNSSEC validating of 
+         non existence of RR types at the root.  Thanks ZjYwMj
 
 1.7.1  2019-07-26
        * bugfix: Manage verification paths for OpenSSL >= 1.1.0
index 99a7515dc4b4cda4baec33498eec4e61123f3bb4..6e7c05735891a5fbac710b6ac7cb4e3e1e2e8dde 100644 (file)
@@ -1503,7 +1503,7 @@ ldns_dnssec_verify_denial(ldns_rr *rr,
                           ldns_rr_list *rrsigs)
 {
        ldns_rdf *rr_name;
-       ldns_rdf *wildcard_name;
+       ldns_rdf *wildcard_name = NULL;
        ldns_rdf *chopped_dname;
        ldns_rr *cur_nsec;
        size_t i;
@@ -1514,14 +1514,19 @@ ldns_dnssec_verify_denial(ldns_rr *rr,
        bool type_covered = false;
        bool wildcard_covered = false;
        bool wildcard_type_covered = false;
+       bool rr_name_is_root = false;
 
-       wildcard_name = ldns_dname_new_frm_str("*");
        rr_name = ldns_rr_owner(rr);
-       chopped_dname = ldns_dname_left_chop(rr_name);
-       result = ldns_dname_cat(wildcard_name, chopped_dname);
-       ldns_rdf_deep_free(chopped_dname);
-       if (result != LDNS_STATUS_OK) {
-               return result;
+       rr_name_is_root =     ldns_rdf_size(rr_name) == 1
+                         && *ldns_rdf_data(rr_name) == 0;
+       if (!rr_name_is_root) {
+               wildcard_name = ldns_dname_new_frm_str("*");
+               chopped_dname = ldns_dname_left_chop(rr_name);
+               result = ldns_dname_cat(wildcard_name, chopped_dname);
+               ldns_rdf_deep_free(chopped_dname);
+               if (result != LDNS_STATUS_OK) {
+                       return result;
+               }
        }
        
        for  (i = 0; i < ldns_rr_list_rr_count(nsecs); i++) {
@@ -1548,6 +1553,9 @@ ldns_dnssec_verify_denial(ldns_rr *rr,
                        name_covered = true;
                }
                
+               if (rr_name_is_root)
+                       continue;
+
                if (ldns_dname_compare(wildcard_name,
                                                   ldns_rr_owner(cur_nsec)) == 0) {
                        if (ldns_nsec_bitmap_covers_type(ldns_nsec_get_bitmap(cur_nsec),
@@ -1568,6 +1576,9 @@ ldns_dnssec_verify_denial(ldns_rr *rr,
                return LDNS_STATUS_DNSSEC_NSEC_RR_NOT_COVERED;
        }
        
+       if (rr_name_is_root)
+               return LDNS_STATUS_OK;
+
        if (wildcard_type_covered || !wildcard_covered) {
                return LDNS_STATUS_DNSSEC_NSEC_WILDCARD_NOT_COVERED;
        }