diff --git a/bin/dig/dighost.c b/bin/dig/dighost.c index 168365fe59..3384191471 100644 --- a/bin/dig/dighost.c +++ b/bin/dig/dighost.c @@ -64,6 +64,7 @@ #include #include #include +#include #include #include #include @@ -3815,6 +3816,32 @@ recv_done(isc_task_t *task, isc_event_t *event) { UNLOCK_LOOKUP; return; } + if (msg->opcode != l->opcode) { + char expect[20] = { 0 }, got[20] = { 0 }; + + isc_buffer_init(&b, &expect, sizeof(expect)); + result = dns_opcode_totext(l->opcode, &b); + check_result(result, "dns_opcode_totext"); + + isc_buffer_init(&b, &got, sizeof(got)); + result = dns_opcode_totext(msg->opcode, &b); + check_result(result, "dns_opcode_totext"); + + dighost_warning("Warning: Opcode mismatch: expected %s, got %s", + expect, got); + + dns_message_destroy(&msg); + if (l->tcp_mode) { + isc_event_free(&event); + clear_query(query); + cancel_lookup(l); + check_next_lookup(l); + UNLOCK_LOOKUP; + return; + } else { + goto udp_mismatch; + } + } if (msg->counts[DNS_SECTION_QUESTION] != 0) { match = true; for (result = dns_message_firstname(msg, DNS_SECTION_QUESTION);