]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
- Fix localdata and rpz localdata to match CNAME only if no direct
authorW.C.A. Wijngaards <wouter@nlnetlabs.nl>
Tue, 19 Mar 2024 09:21:10 +0000 (10:21 +0100)
committerW.C.A. Wijngaards <wouter@nlnetlabs.nl>
Tue, 19 Mar 2024 09:21:10 +0000 (10:21 +0100)
  type match is available.

doc/Changelog
services/localzone.c
services/rpz.c
testdata/local_cnameother.rpl [new file with mode: 0644]

index 48106ac467852ff5fbf00de165116e2257db4f9f..866abe211193fef41d638dc6c94814b1f9c664c0 100644 (file)
@@ -1,6 +1,8 @@
 19 March 2024: Wouter
        - Fix rpz so that rpz CNAME can apply after rpz CNAME. And fix that
          clientip and nsip can give a CNAME.
+       - Fix localdata and rpz localdata to match CNAME only if no direct
+         type match is available.
 
 18 March 2024: Wouter
        - Fix that rpz CNAME content is limited to the max number of cnames.
index 9c8e3c7acb16c6e580e4b21793f37e27a514d485..51056c8ffef4a7388e45a83913fb0bbc275ac462 100644 (file)
@@ -330,14 +330,16 @@ get_rr_nameclass(const char* str, uint8_t** nm, uint16_t* dclass,
 static struct local_rrset*
 local_data_find_type(struct local_data* data, uint16_t type, int alias_ok)
 {
-       struct local_rrset* p;
+       struct local_rrset* p, *cname = NULL;
        type = htons(type);
        for(p = data->rrsets; p; p = p->next) {
                if(p->rrset->rk.type == type)
                        return p;
                if(alias_ok && p->rrset->rk.type == htons(LDNS_RR_TYPE_CNAME))
-                       return p;
+                       cname = p;
        }
+       if(alias_ok)
+               return cname;
        return NULL;
 }
 
index 0bbb886f90bcc9d24cd0bb64a31b7da636048d71..f036cc5fd6493c50659029b580180ae527634019 100644 (file)
@@ -2073,14 +2073,16 @@ rpz_synthesize_nsip_localdata(struct rpz* r, struct module_qstate* ms,
 static struct local_rrset*
 local_data_find_type(struct local_data* data, uint16_t type, int alias_ok)
 {
-       struct local_rrset* p;
+       struct local_rrset* p, *cname = NULL;
        type = htons(type);
        for(p = data->rrsets; p; p = p->next) {
                if(p->rrset->rk.type == type)
                        return p;
                if(alias_ok && p->rrset->rk.type == htons(LDNS_RR_TYPE_CNAME))
-                       return p;
+                       cname = p;
        }
+       if(alias_ok)
+               return cname;
        return NULL;
 }
 
diff --git a/testdata/local_cnameother.rpl b/testdata/local_cnameother.rpl
new file mode 100644 (file)
index 0000000..d86ba4f
--- /dev/null
@@ -0,0 +1,67 @@
+; config options
+server:
+       local-zone: "a." static
+       local-data: "myd.a. NSEC myd2.a. CNAME NSEC"
+       local-data: "myd.a. CNAME myd.target.a."
+
+       ; Switches the types first one then the other.
+       local-data: "myd2.a. CNAME myd2.target.a."
+       local-data: "myd2.a. NSEC myd3.a. CNAME NSEC"
+
+stub-zone:
+        name: "a"
+        stub-addr: 1.2.3.4
+
+CONFIG_END
+SCENARIO_BEGIN Test local data queries with CNAME and other data.
+
+RANGE_BEGIN 0 1000
+       ADDRESS 1.2.3.4
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+www.refuse.top. IN A
+SECTION ANSWER
+www.refuse.top. IN A 5.5.5.5
+ENTRY_END
+RANGE_END
+
+; local data query for type next to CNAME, the specific type should
+; be preferred over the CNAME.
+STEP 10 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+myd.a. IN NSEC
+ENTRY_END
+
+STEP 20 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA AA
+SECTION QUESTION
+myd.a. IN NSEC
+SECTION ANSWER
+myd.a. NSEC myd2.a. CNAME NSEC
+ENTRY_END
+
+STEP 30 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+myd2.a. IN NSEC
+ENTRY_END
+
+STEP 40 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA AA
+SECTION QUESTION
+myd2.a. IN NSEC
+SECTION ANSWER
+myd2.a. NSEC myd3.a. CNAME NSEC
+ENTRY_END
+
+SCENARIO_END