From: Mark Andrews Date: Tue, 5 Feb 2019 23:08:47 +0000 (+1100) Subject: the condition test for checking the client cookie value was wrong; don't call process... X-Git-Tag: v9.12.4rc1~29^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bb3a5986bb1443d19ae4064935d58f0bd0ac3f9a;p=thirdparty%2Fbind9.git the condition test for checking the client cookie value was wrong; don't call process_opt multiple times (cherry picked from commit d9c368eee0826a3fbf7111e591dedcf53cb66c0b) --- diff --git a/bin/dig/dighost.c b/bin/dig/dighost.c index d5a9c904afe..46166c743e3 100644 --- a/bin/dig/dighost.c +++ b/bin/dig/dighost.c @@ -3457,7 +3457,7 @@ process_cookie(dig_lookup_t *l, dns_message_t *msg, } INSIST(msg->cc_ok == 0 && msg->cc_bad == 0); - if (optlen >= len && optlen >= 8U) { + if (len >= 8 && optlen >= 8U) { if (isc_safe_memequal(isc_buffer_current(optbuf), sent, 8)) { msg->cc_ok = 1; } else { @@ -3543,6 +3543,7 @@ recv_done(isc_task_t *task, isc_event_t *event) { dig_lookup_t *n, *l; bool docancel = false; bool match = true; + bool done_process_opt = false; unsigned int parseflags; dns_messageid_t id; unsigned int msgflags; @@ -3838,6 +3839,7 @@ recv_done(isc_task_t *task, isc_event_t *event) { UNLOCK_LOOKUP; return; } + done_process_opt = true; } if ((msg->rcode == dns_rcode_servfail && !l->servfail_stops) || (check_ra && (msg->flags & DNS_MESSAGEFLAG_RA) == 0 && l->recurse)) @@ -3927,13 +3929,17 @@ recv_done(isc_task_t *task, isc_event_t *event) { } } - if (l->cookie != NULL) { - if (msg->opt == NULL) - printf(";; expected opt record in response\n"); - else + if (!done_process_opt) { + if (l->cookie != NULL) { + if (msg->opt == NULL) { + printf(";; expected opt record in response\n"); + } else { + process_opt(l, msg); + } + } else if (l->sendcookie && msg->opt != NULL) { process_opt(l, msg); - } else if (l->sendcookie && msg->opt != NULL) - process_opt(l, msg); + } + } if (!l->doing_xfr || l->xfr_q == query) { if (msg->rcode == dns_rcode_nxdomain && (l->origin != NULL || l->need_search)) {