From: Štěpán Balážik Date: Wed, 20 Jan 2021 15:19:18 +0000 (+0100) Subject: selection: force resolution of new NS name after lame delegation X-Git-Tag: v5.3.0~15^2~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=34b735bdc25b0b4e02d7ac8bb9341f5b90ca4be5;p=thirdparty%2Fknot-resolver.git selection: force resolution of new NS name after lame delegation Lame delegations are weird, they breed more lame delegations on broken zones since trying another server from the same set usualy doesn't help. We force resolution of another NS name in hope of getting somewhere. --- diff --git a/lib/selection.c b/lib/selection.c index 239015897..e0266404a 100644 --- a/lib/selection.c +++ b/lib/selection.c @@ -549,10 +549,20 @@ void error(struct kr_query *qry, struct address_state *addr_state, qry->flags.NO_MINIMIZE = true; } break; + case KR_SELECTION_LAME_DELEGATION: + if (qry->flags.NO_MINIMIZE) { + /* Lame delegations are weird, they breed more lame delegations on broken + * zones since trying another server from the same set usualy doesn't help. + * We force resolution of another NS name in hope of getting somewhere. */ + qry->server_selection.local_state->force_resolve = true; + addr_state->broken = true; + } else { + qry->flags.NO_MINIMIZE = true; + } + break; case KR_SELECTION_NOTIMPL: case KR_SELECTION_OTHER_RCODE: case KR_SELECTION_DNSSEC_ERROR: - case KR_SELECTION_LAME_DELEGATION: case KR_SELECTION_BAD_CNAME: case KR_SELECTION_MALFORMED: /* These errors are fatal, no point in trying this server again. */ diff --git a/lib/selection.h b/lib/selection.h index c4268b0f3..46fad61d9 100644 --- a/lib/selection.h +++ b/lib/selection.h @@ -77,6 +77,9 @@ struct kr_transport { struct local_state { int timeouts; /**< Number of timeouts that occured resolving this query.*/ bool truncated; /**< Query was truncated, switch to TCP. */ + /** Force resolution of a new NS name (if possible) + * Done by selection.c:error in some cases. */ + bool force_resolve; void *private; /**< Inner state of the implementation.*/ }; diff --git a/lib/selection_iter.c b/lib/selection_iter.c index f7727c620..7596711cd 100644 --- a/lib/selection_iter.c +++ b/lib/selection_iter.c @@ -249,6 +249,11 @@ void iter_choose_transport(struct kr_query *qry, struct kr_transport **transport int choices_len = get_valid_addresses(local_state, choices); int resolvable_len = get_resolvable_names(local_state, resolvable, qry); + if (qry->server_selection.local_state->force_resolve && resolvable_len) { + choices_len = 0; + qry->server_selection.local_state->force_resolve = false; + } + bool tcp = qry->flags.TCP || qry->server_selection.local_state->truncated; *transport = select_transport(choices, choices_len, resolvable, resolvable_len, qry->server_selection.local_state->timeouts,