From: Ralph Dolmans Date: Tue, 7 Aug 2018 12:43:49 +0000 (+0000) Subject: - Make capsforid fallback QNAME minimisation aware. X-Git-Tag: release-1.8.0rc1~42 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3f2d18669439de08faa1eba96672cb93df2a2ce7;p=thirdparty%2Funbound.git - Make capsforid fallback QNAME minimisation aware. git-svn-id: file:///svn/unbound/trunk@4840 be551aaa-1e26-0410-a405-d3ace91eadb9 --- diff --git a/doc/Changelog b/doc/Changelog index 3d7939bfb..217f65024 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -1,3 +1,6 @@ +7 August 2018: Ralph + - Make capsforid fallback QNAME minimisation aware. + 7 August 2018: Wouter - Fix #4142: unbound.service.in: improvements and fixes. Add unit dependency ordering (based on systemd-resolved). diff --git a/iterator/iterator.c b/iterator/iterator.c index f6bb30bf2..331a8aa7b 100644 --- a/iterator/iterator.c +++ b/iterator/iterator.c @@ -3448,6 +3448,7 @@ process_response(struct module_qstate* qstate, struct iter_qstate* iq, iq->caps_server = 0; iq->caps_reply = NULL; iq->caps_response = NULL; + iq->caps_minimisation_state = DONOT_MINIMISE_STATE; iq->state = QUERYTARGETS_STATE; iq->num_current_queries--; /* need fresh attempts for the 0x20 fallback, if @@ -3514,6 +3515,7 @@ process_response(struct module_qstate* qstate, struct iter_qstate* iq, iq->caps_server = 0; iq->caps_reply = NULL; iq->caps_response = NULL; + iq->caps_minimisation_state = DONOT_MINIMISE_STATE; iq->state = QUERYTARGETS_STATE; iq->num_current_queries--; verbose(VERB_DETAIL, "Capsforid: scrub failed, starting fallback with no response"); @@ -3533,15 +3535,30 @@ process_response(struct module_qstate* qstate, struct iter_qstate* iq, iq->response->rep); if(event == module_event_capsfail || iq->caps_fallback) { + if(qstate->env->cfg->qname_minimisation && + iq->minimisation_state != DONOT_MINIMISE_STATE) { + /* Skip QNAME minimisation for next query, since that + * one has to match the current query. */ + iq->minimisation_state = SKIP_MINIMISE_STATE; + } /* for fallback we care about main answer, not additionals */ /* removing that makes comparison more likely to succeed */ caps_strip_reply(iq->response->rep); + + if(iq->caps_fallback && + iq->caps_minimisation_state != iq->minimisation_state) { + /* QNAME minimisation state has changed, restart caps + * fallback. */ + iq->caps_fallback = 0; + } + if(!iq->caps_fallback) { /* start fallback */ iq->caps_fallback = 1; iq->caps_server = 0; iq->caps_reply = iq->response->rep; iq->caps_response = iq->response; + iq->caps_minimisation_state = iq->minimisation_state; iq->state = QUERYTARGETS_STATE; iq->num_current_queries--; verbose(VERB_DETAIL, "Capsforid: starting fallback"); diff --git a/iterator/iterator.h b/iterator/iterator.h index 67ffeb147..57cb7c4c4 100644 --- a/iterator/iterator.h +++ b/iterator/iterator.h @@ -371,6 +371,9 @@ struct iter_qstate { /** QNAME minimisation state, RFC7816 */ enum minimisation_state minimisation_state; + /** State for capsfail: QNAME minimisation state for comparisons. */ + enum minimisation_state caps_minimisation_state; + /** * The query info that is sent upstream. Will be a subset of qchase * when qname minimisation is enabled.