From: Štěpán Balážik Date: Fri, 16 Oct 2020 14:24:15 +0000 (+0200) Subject: selection: properly check for cyclic NS dependencies X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2b91196d35d514fb6a2353f5874f519ea6f7bae5;p=thirdparty%2Fknot-resolver.git selection: properly check for cyclic NS dependencies This is kind of done in ns_resolve_addr as well, but we need this information *before* making the choice. --- diff --git a/lib/selection_iter.c b/lib/selection_iter.c index d651ed760..9cb850f5d 100644 --- a/lib/selection_iter.c +++ b/lib/selection_iter.c @@ -226,10 +226,12 @@ void iter_choose_transport(struct kr_query *qry, struct kr_transport **transport struct iter_name_state *name_state = *(struct iter_name_state **)trie_it_val(it); if (name_state->generation == local_state->generation) { knot_dname_t *name = (knot_dname_t *)trie_it_key(it, NULL); - if (name_state->a_state == RECORD_UNKNOWN && !qry->flags.NO_IPV4) { + bool a_in_rplan = kr_rplan_satisfies(qry->parent, name, KNOT_CLASS_IN, KNOT_RRTYPE_A); + bool aaaa_in_rplan = kr_rplan_satisfies(qry->parent, name, KNOT_CLASS_IN, KNOT_RRTYPE_AAAA); + if (name_state->a_state == RECORD_UNKNOWN && !qry->flags.NO_IPV4 && !a_in_rplan) { unresolved_types[num_to_resolve++] = (struct to_resolve){name, KR_TRANSPORT_RESOLVE_A}; } - if (name_state->aaaa_state == RECORD_UNKNOWN && !qry->flags.NO_IPV6) { + if (name_state->aaaa_state == RECORD_UNKNOWN && !qry->flags.NO_IPV6 && !aaaa_in_rplan) { unresolved_types[num_to_resolve++] = (struct to_resolve){name, KR_TRANSPORT_RESOLVE_AAAA}; } }