]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
4281. [bug] Teach dns_message_totext about BADCOOKIE. [RT #41257]
authorMark Andrews <marka@isc.org>
Tue, 15 Dec 2015 08:49:40 +0000 (19:49 +1100)
committerMark Andrews <marka@isc.org>
Tue, 15 Dec 2015 08:49:40 +0000 (19:49 +1100)
CHANGES
bin/named/query.c
bin/tests/system/cookie/tests.sh
lib/dns/message.c
lib/dns/rcode.c

diff --git a/CHANGES b/CHANGES
index 6dcd77eea8ffcf0dc57f3b6500d1871b7e175e06..555755a91c717cbf7f5f3c6ec61381e42760991a 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,5 @@
+4281.  [bug]           Teach dns_message_totext about BADCOOKIE. [RT #41257]
+
 4280.  [performance]   Use optimal message sizes to improve compression
                        in AXFRs. This reduces network traffic. [RT #40996]
 
index 3a492b32a19976e10a58acde94a645ef5e037dfd..bbed4c8d416dd40758541504cc04dd84e5ccf12f 100644 (file)
@@ -6960,6 +6960,8 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
                                        inc_stats(client,
                                                dns_nsstatscounter_rateslipped);
                                        if (WANTCOOKIE(client)) {
+                                               client->message->flags &=
+                                                       ~DNS_MESSAGEFLAG_AA;
                                                client->message->flags &=
                                                        ~DNS_MESSAGEFLAG_AD;
                                                client->message->rcode =
@@ -6978,6 +6980,8 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
                }
        } else if (!TCP(client) && client->view->requireservercookie &&
                   WANTCOOKIE(client) && !HAVECOOKIE(client)) {
+               client->message->flags &= ~DNS_MESSAGEFLAG_AA;
+               client->message->flags &= ~DNS_MESSAGEFLAG_AD;
                client->message->rcode = dns_rcode_badcookie;
                goto cleanup;
        }
index cea0a76a86df4b99c15e4b50d51acb166361241c..10f4198fd7c331b324bd41f9597c21cfcacc0145 100755 (executable)
@@ -127,6 +127,8 @@ n=`expr $n + 1`
 echo "I:checking require-server-cookie yes ($n)"
 ret=0
 $DIG +qr +cookie +nobadcookie soa @10.53.0.3 -p 5300 > dig.out.test$n
+grep "flags: qr[^;]* aa[ ;]" dig.out.test$n > /dev/null && ret=1
+grep "flags: qr[^;]* ad[ ;]" dig.out.test$n > /dev/null && ret=1
 grep BADCOOKIE dig.out.test$n > /dev/null || ret=1
 linecount=`getcookie dig.out.test$n | wc -l`
 if [ $linecount != 2 ]; then ret=1; fi
index 9e56a6e8fdf45311e4c5bdd846e459b5d3143d2a..a30e5edf894295c375dcbfb0f9fabad1be6037af 100644 (file)
@@ -36,6 +36,7 @@
 #include <dns/masterdump.h>
 #include <dns/message.h>
 #include <dns/opcode.h>
+#include <dns/rcode.h>
 #include <dns/rdata.h>
 #include <dns/rdatalist.h>
 #include <dns/rdataset.h>
@@ -145,27 +146,6 @@ static const char *opcodetext[] = {
        "RESERVED15"
 };
 
-static const char *rcodetext[] = {
-       "NOERROR",
-       "FORMERR",
-       "SERVFAIL",
-       "NXDOMAIN",
-       "NOTIMP",
-       "REFUSED",
-       "YXDOMAIN",
-       "YXRRSET",
-       "NXRRSET",
-       "NOTAUTH",
-       "NOTZONE",
-       "RESERVED11",
-       "RESERVED12",
-       "RESERVED13",
-       "RESERVED14",
-       "RESERVED15",
-       "BADVERS"
-};
-
-
 /*%
  * "helper" type, which consists of a block of some type, and is linkable.
  * For it to work, sizeof(dns_msgblock_t) must be a multiple of the pointer
@@ -3491,7 +3471,8 @@ dns_message_pseudosectiontotext(dns_message_t *msg,
 
 isc_result_t
 dns_message_totext(dns_message_t *msg, const dns_master_style_t *style,
-                  dns_messagetextflag_t flags, isc_buffer_t *target) {
+                  dns_messagetextflag_t flags, isc_buffer_t *target)
+{
        unsigned int sflags = dns_master_styleflags(style);
        char buf[sizeof("1234567890")];
        isc_result_t result;
@@ -3505,12 +3486,9 @@ dns_message_totext(dns_message_t *msg, const dns_master_style_t *style,
                ADD_STRING(target, ";; ->>HEADER<<- opcode: ");
                ADD_STRING(target, opcodetext[msg->opcode]);
                ADD_STRING(target, ", status: ");
-               if (msg->rcode < (sizeof(rcodetext)/sizeof(rcodetext[0]))) {
-                       ADD_STRING(target, rcodetext[msg->rcode]);
-               } else {
-                       snprintf(buf, sizeof(buf), "%4u", msg->rcode);
-                       ADD_STRING(target, buf);
-               }
+               result = dns_rcode_totext(msg->rcode, target);
+               if (result != ISC_R_SUCCESS)
+                       return (result);
                ADD_STRING(target, ", id: ");
                snprintf(buf, sizeof(buf), "%6u", msg->id);
                ADD_STRING(target, buf);
index cd804e07ef588a290509abe171dac040cf2c6bab..3509b6152c13b54483202343b0cc1fcd36fd949c 100644 (file)
@@ -51,6 +51,8 @@
 
 #define NUMBERSIZE sizeof("037777777777") /* 2^32-1 octal + NUL */
 
+#define TOTEXTONLY 0x01
+
 #define RCODENAMES \
        /* standard rcodes */ \
        { dns_rcode_noerror, "NOERROR", 0}, \
        { dns_rcode_yxrrset, "YXRRSET", 0}, \
        { dns_rcode_nxrrset, "NXRRSET", 0}, \
        { dns_rcode_notauth, "NOTAUTH", 0}, \
-       { dns_rcode_notzone, "NOTZONE", 0},
+       { dns_rcode_notzone, "NOTZONE", 0}, \
+       { 11, "RESERVED11", TOTEXTONLY}, \
+       { 12, "RESERVED12", TOTEXTONLY}, \
+       { 13, "RESERVED13", TOTEXTONLY}, \
+       { 14, "RESERVED14", TOTEXTONLY}, \
+       { 15, "RESERVED15", TOTEXTONLY},
 
 #define ERCODENAMES \
        /* extended rcodes */ \
@@ -260,6 +267,7 @@ dns_mnemonic_fromtext(unsigned int *valuep, isc_textregion_t *source,
                unsigned int n;
                n = strlen(table[i].name);
                if (n == source->length &&
+                   (table[i].flags & TOTEXTONLY) == 0 &&
                    strncasecmp(source->base, table[i].name, n) == 0) {
                        *valuep = table[i].value;
                        return (ISC_R_SUCCESS);