]> git.ipfire.org Git - thirdparty/knot-dns.git/commitdiff
semantic check: improve glue check if covered by wildcard
authorDaniel Salzman <daniel.salzman@nic.cz>
Fri, 23 Aug 2019 11:57:49 +0000 (13:57 +0200)
committerDaniel Salzman <daniel.salzman@nic.cz>
Fri, 23 Aug 2019 15:10:29 +0000 (17:10 +0200)
src/knot/zone/semantic-check.c
tests/knot/semantic_check_data/glue_wildcard.valid

index e4ea4367fa759d40a75f6d8c51ccefc519419051..f163c61af6e5861b5f1cb261798b8d8fc720ca83 100644 (file)
@@ -482,23 +482,27 @@ static int check_delegation(const zone_node_t *node, semchecks_data_t *data)
                knot_rdata_t *ns_rr = knot_rdataset_at(ns_rrs, i);
                const knot_dname_t *ns_dname = knot_ns_name(ns_rr);
                const zone_node_t *glue_node = NULL, *glue_encloser = NULL;
-               int res = zone_contents_find_dname(data->zone, ns_dname, &glue_node, &glue_encloser, NULL);
-               if (res == KNOT_EOUTOFZONE) {
+               int ret = zone_contents_find_dname(data->zone, ns_dname, &glue_node,
+                                                  &glue_encloser, NULL);
+               switch (ret) {
+               case KNOT_EOUTOFZONE:
                        continue; // NS is out of bailiwick
-               }
-               if (glue_encloser != NULL && glue_encloser != node &&
-                   (glue_encloser->flags & (NODE_FLAGS_DELEG | NODE_FLAGS_NONAUTH))) {
-                       continue; // NS is below another delegation
-               }
+               case ZONE_NAME_NOT_FOUND:
+                       if (glue_encloser != node &&
+                           glue_encloser->flags & (NODE_FLAGS_DELEG | NODE_FLAGS_NONAUTH)) {
+                               continue; // NS is below another delegation
+                       }
 
-               if (glue_node == NULL) {
-                       /* Try wildcard ([1]* + suffix). */
-                       knot_dname_t wildcard[KNOT_DNAME_MAXLEN];
-                       memcpy(wildcard, "\x1""*", 2);
-                       knot_dname_to_wire(wildcard + 2,
-                                          knot_wire_next_label(ns_dname, NULL),
+                       // check if covered by wildcard
+                       knot_dname_t wildcard[KNOT_DNAME_MAXLEN] = "\x1""*";
+                       knot_dname_to_wire(wildcard + 2, glue_encloser->owner,
                                           sizeof(wildcard) - 2);
                        glue_node = zone_contents_find_node(data->zone, wildcard);
+                       break; // continue in checking glue existence
+               case ZONE_NAME_FOUND:
+                       break; // continue in checking glue existence
+               default:
+                       return ret;
                }
                if (!node_rrtype_exists(glue_node, KNOT_RRTYPE_A) &&
                    !node_rrtype_exists(glue_node, KNOT_RRTYPE_AAAA)) {
index 658851fd837373d46b01343105cdcd63248dfff0..9e36b5e163b447f139701218b2dd79e3fa9ec8cd 100644 (file)
@@ -13,7 +13,10 @@ $TTL 3600
 dns1   A       1.2.3.4
 
 abc    NS      a.ns.abc
+deleg1 NS      a.ns.abc
+deleg2 NS      a.ns.ns.ns.ns.xyz
 
 ; wildcard glue
 
 *.ns.abc       AAAA    ::1
+*.ns.xyz       AAAA    ::2