]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Report opcode mismatch
authorMark Andrews <marka@isc.org>
Wed, 11 Mar 2020 02:55:14 +0000 (13:55 +1100)
committerMark Andrews <marka@isc.org>
Thu, 12 Mar 2020 23:28:18 +0000 (10:28 +1100)
bin/dig/dighost.c

index 168365fe595b597cfb6ff22e67e8e40794686b08..33841914714b0f3ac1027d94dea1136323d88a1a 100644 (file)
@@ -64,6 +64,7 @@
 #include <dns/log.h>
 #include <dns/message.h>
 #include <dns/name.h>
+#include <dns/opcode.h>
 #include <dns/rcode.h>
 #include <dns/rdata.h>
 #include <dns/rdataclass.h>
@@ -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);