]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
- Robust checks on dname validity from rdata for dname compare.
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Thu, 25 Apr 2013 10:28:25 +0000 (10:28 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Thu, 25 Apr 2013 10:28:25 +0000 (10:28 +0000)
git-svn-id: file:///svn/unbound/trunk@2892 be551aaa-1e26-0410-a405-d3ace91eadb9

doc/Changelog
validator/val_sigcrypt.c
validator/val_utils.c

index ed12bf5667995a431bf0e7e33360f127aff7c97b..f42e9338d0d62f3bc495c1683b46c9c4ad616bbe 100644 (file)
@@ -1,3 +1,6 @@
+25 April 2013: Wouter
+       - Robust checks on dname validity from rdata for dname compare.
+
 19 April 2013: Wouter
        - Fixup snprintf return value usage, fixed libunbound_get_option.
 
index 79d5e45a237918caa01c74f2f18c8238314a084e..4642ea6da22e896f710d3f9b8f99f0eef977a8ba 100644 (file)
@@ -808,7 +808,12 @@ canonical_compare(struct ub_packed_rrset_key* rrset, size_t i, size_t j)
                case LDNS_RR_TYPE_MR:
                case LDNS_RR_TYPE_PTR:
                case LDNS_RR_TYPE_DNAME:
-                       return query_dname_compare(d->rr_data[i]+2, 
+                       /* the wireread function has already checked these
+                        * dname's for correctness, and this double checks */
+                       if(!dname_valid(d->rr_data[i]+2, d->rr_len[i]-2) ||
+                               !dname_valid(d->rr_data[j]+2, d->rr_len[j]-2))
+                               return 0;
+                       return query_dname_compare(d->rr_data[i]+2,
                                d->rr_data[j]+2);
 
                /* These RR types have STR and fixed size rdata fields
index d4a64464d80873b6f535bd62bc1b9b8d50007708..768f2368a8f538ec29d07dd11f70f825c5feab8b 100644 (file)
@@ -773,6 +773,8 @@ rrset_has_signer(struct ub_packed_rrset_key* rrset, uint8_t* name, size_t len)
        for(i = d->count; i< d->count+d->rrsig_count; i++) {
                if(d->rr_len[i] > 2+18+len) {
                        /* at least rdatalen + signature + signame (+1 sig)*/
+                       if(!dname_valid(d->rr_data[i]+2+18, d->rr_len[i]-2-18))
+                               continue;
                        if(query_dname_compare(name, d->rr_data[i]+2+18) == 0)
                        {
                                return 1;