]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
3893. [bug] Peer DSCP values could be returned without being set.
authorMark Andrews <marka@isc.org>
Tue, 15 Jul 2014 12:40:39 +0000 (22:40 +1000)
committerMark Andrews <marka@isc.org>
Tue, 15 Jul 2014 12:41:21 +0000 (22:41 +1000)
                        [RT #36538]

(cherry picked from commit a920fb9dc2ff16f32dd73e53469d0febcdcc6c11)

CHANGES
lib/dns/peer.c
lib/dns/tests/Makefile.in
lib/dns/tests/peer_test.c [new file with mode: 0644]

diff --git a/CHANGES b/CHANGES
index 41e7e037140c969fa064087dc4c0b72fc31d614f..8f1721678d545ad9e44447d622450ef26f23aa50 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+3893.  [bug]           Peer DSCP values could be returned without being set.
+                       [RT #36538]
+
 3892.  [bug]           Setting '-t aaaa' in .digrc had unintended side
                        effects. [RT #36452]
 
index c4df3abafa8a517fc9ef279ee9a3990d6846d0ca..40520d7614869239e19d60f48fdc85b2806f93cf 100644 (file)
 /*%
  * Bit positions in the dns_peer_t structure flags field
  */
-#define BOGUS_BIT                      0
-#define SERVER_TRANSFER_FORMAT_BIT     1
-#define TRANSFERS_BIT                  2
-#define PROVIDE_IXFR_BIT               3
-#define REQUEST_IXFR_BIT               4
-#define SUPPORT_EDNS_BIT               5
-#define SERVER_UDPSIZE_BIT             6
-#define SERVER_MAXUDP_BIT              7
-#define REQUEST_NSID_BIT                8
-#define REQUEST_SIT_BIT                 9
+#define BOGUS_BIT                       0
+#define SERVER_TRANSFER_FORMAT_BIT      1
+#define TRANSFERS_BIT                   2
+#define PROVIDE_IXFR_BIT                3
+#define REQUEST_IXFR_BIT                4
+#define SUPPORT_EDNS_BIT                5
+#define SERVER_UDPSIZE_BIT              6
+#define SERVER_MAXUDP_BIT               7
+#define REQUEST_NSID_BIT                 8
+#define REQUEST_SIT_BIT                  9
+#define NOTIFY_DSCP_BIT                 10
+#define TRANSFER_DSCP_BIT               11
+#define QUERY_DSCP_BIT                         12
 
 static void
 peerlist_delete(dns_peerlist_t **list);
@@ -749,6 +752,7 @@ dns_peer_setnotifydscp(dns_peer_t *peer, isc_dscp_t dscp) {
        REQUIRE(dscp < 64);
 
        peer->notify_dscp = dscp;
+       DNS_BIT_SET(NOTIFY_DSCP_BIT, &peer->bitflags);
        return (ISC_R_SUCCESS);
 }
 
@@ -757,8 +761,11 @@ dns_peer_getnotifydscp(dns_peer_t *peer, isc_dscp_t *dscpp) {
        REQUIRE(DNS_PEER_VALID(peer));
        REQUIRE(dscpp != NULL);
 
-       *dscpp = peer->notify_dscp;
-       return (ISC_R_SUCCESS);
+       if (DNS_BIT_CHECK(NOTIFY_DSCP_BIT, &peer->bitflags)) {
+               *dscpp = peer->notify_dscp;
+               return (ISC_R_SUCCESS);
+       }
+       return (ISC_R_NOTFOUND);
 }
 
 isc_result_t
@@ -767,6 +774,7 @@ dns_peer_settransferdscp(dns_peer_t *peer, isc_dscp_t dscp) {
        REQUIRE(dscp < 64);
 
        peer->transfer_dscp = dscp;
+       DNS_BIT_SET(TRANSFER_DSCP_BIT, &peer->bitflags);
        return (ISC_R_SUCCESS);
 }
 
@@ -775,8 +783,11 @@ dns_peer_gettransferdscp(dns_peer_t *peer, isc_dscp_t *dscpp) {
        REQUIRE(DNS_PEER_VALID(peer));
        REQUIRE(dscpp != NULL);
 
-       *dscpp = peer->transfer_dscp;
-       return (ISC_R_SUCCESS);
+       if (DNS_BIT_CHECK(TRANSFER_DSCP_BIT, &peer->bitflags)) {
+               *dscpp = peer->transfer_dscp;
+               return (ISC_R_SUCCESS);
+       }
+       return (ISC_R_NOTFOUND);
 }
 
 isc_result_t
@@ -785,6 +796,7 @@ dns_peer_setquerydscp(dns_peer_t *peer, isc_dscp_t dscp) {
        REQUIRE(dscp < 64);
 
        peer->query_dscp = dscp;
+       DNS_BIT_SET(QUERY_DSCP_BIT, &peer->bitflags);
        return (ISC_R_SUCCESS);
 }
 
@@ -793,6 +805,9 @@ dns_peer_getquerydscp(dns_peer_t *peer, isc_dscp_t *dscpp) {
        REQUIRE(DNS_PEER_VALID(peer));
        REQUIRE(dscpp != NULL);
 
-       *dscpp = peer->query_dscp;
-       return (ISC_R_SUCCESS);
+       if (DNS_BIT_CHECK(QUERY_DSCP_BIT, &peer->bitflags)) {
+               *dscpp = peer->query_dscp;
+               return (ISC_R_SUCCESS);
+       }
+       return (ISC_R_NOTFOUND);
 }
index 824476714f3296ba9525837bdae917c49379f435..4c734041a8b5d6db83bd9b2a8729983488e1832a 100644 (file)
@@ -47,6 +47,7 @@ SRCS =                db_test.c \
                gost_test.c \
                master_test.c \
                nsec3_test.c \
+               peer_test.c \
                private_test.c \
                rbt_test.c \
                rbt_serialize_test.c \
@@ -68,6 +69,7 @@ TARGETS =     db_test@EXEEXT@ \
                gost_test@EXEEXT@ \
                master_test@EXEEXT@ \
                nsec3_test@EXEEXT@ \
+               peer_test@EXEEXT@ \
                private_test@EXEEXT@ \
                rbt_test@EXEEXT@ \
                rbt_serialize_test@EXEEXT@ \
@@ -99,6 +101,11 @@ time_test@EXEEXT@: time_test.@O@ dnstest.@O@ ${ISCDEPLIBS} ${DNSDEPLIBS}
                        time_test.@O@ dnstest.@O@ ${DNSLIBS} \
                                ${ISCLIBS} ${LIBS}
 
+peer_test@EXEEXT@: peer_test.@O@ dnstest.@O@ ${ISCDEPLIBS} ${DNSDEPLIBS}
+       ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
+                       peer_test.@O@ dnstest.@O@ ${DNSLIBS} \
+                               ${ISCLIBS} ${LIBS}
+
 private_test@EXEEXT@: private_test.@O@ dnstest.@O@ ${ISCDEPLIBS} ${DNSDEPLIBS}
        ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
                        private_test.@O@ dnstest.@O@ ${DNSLIBS} \
diff --git a/lib/dns/tests/peer_test.c b/lib/dns/tests/peer_test.c
new file mode 100644 (file)
index 0000000..5f5bc53
--- /dev/null
@@ -0,0 +1,145 @@
+/*
+ * Copyright (C) 2014  Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*! \file */
+
+#include <config.h>
+
+#include <atf-c.h>
+
+#include <unistd.h>
+
+#include <dns/peer.h>
+
+#include "dnstest.h"
+
+/*
+ * Individual unit tests
+ */
+ATF_TC(dscp);
+ATF_TC_HEAD(dscp, tc) {
+       atf_tc_set_md_var(tc, "descr",
+                         "Test DSCP set/get functions");
+}
+ATF_TC_BODY(dscp, tc) {
+       isc_result_t result;
+       isc_netaddr_t netaddr;
+       struct in_addr ina;
+       dns_peer_t *peer = NULL;
+       isc_dscp_t dscp;
+
+       result = dns_test_begin(NULL, ISC_TRUE);
+       ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+
+       /*
+        * Create peer structure for the loopback address.
+        */
+       ina.s_addr = INADDR_LOOPBACK;
+       isc_netaddr_fromin(&netaddr, &ina);
+       result = dns_peer_new(mctx, &netaddr, &peer);
+       ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+
+       /*
+        * All should be not set on creation.
+        * 'dscp' should remain unchanged.
+        */
+       dscp = 100;
+       result = dns_peer_getquerydscp(peer, &dscp);
+       ATF_REQUIRE_EQ(result, ISC_R_NOTFOUND);
+       ATF_REQUIRE_EQ(dscp, 100);
+
+       result = dns_peer_getnotifydscp(peer, &dscp);
+       ATF_REQUIRE_EQ(result, ISC_R_NOTFOUND);
+       ATF_REQUIRE_EQ(dscp, 100);
+
+       result = dns_peer_gettransferdscp(peer, &dscp);
+       ATF_REQUIRE_EQ(result, ISC_R_NOTFOUND);
+       ATF_REQUIRE_EQ(dscp, 100);
+
+       /*
+        * Test that setting query dscp does not affect the other
+        * dscp values.  'dscp' should remain unchanged until
+        * dns_peer_getquerydscp is called.
+        */
+       dscp = 100;
+       result = dns_peer_setquerydscp(peer, 1);
+       ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+
+       result = dns_peer_getnotifydscp(peer, &dscp);
+       ATF_REQUIRE_EQ(result, ISC_R_NOTFOUND);
+       ATF_REQUIRE_EQ(dscp, 100);
+
+       result = dns_peer_gettransferdscp(peer, &dscp);
+       ATF_REQUIRE_EQ(result, ISC_R_NOTFOUND);
+       ATF_REQUIRE_EQ(dscp, 100);
+
+       result = dns_peer_getquerydscp(peer, &dscp);
+       ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+       ATF_REQUIRE_EQ(dscp, 1);
+
+       /*
+        * Test that setting notify dscp does not affect the other
+        * dscp values.  'dscp' should remain unchanged until
+        * dns_peer_getquerydscp is called then should change again
+        * on dns_peer_getnotifydscp.
+        */
+       dscp = 100;
+       result = dns_peer_setnotifydscp(peer, 2);
+       ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+
+       result = dns_peer_gettransferdscp(peer, &dscp);
+       ATF_REQUIRE_EQ(result, ISC_R_NOTFOUND);
+       ATF_REQUIRE_EQ(dscp, 100);
+
+       result = dns_peer_getquerydscp(peer, &dscp);
+       ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+       ATF_REQUIRE_EQ(dscp, 1);
+
+       result = dns_peer_getnotifydscp(peer, &dscp);
+       ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+       ATF_REQUIRE_EQ(dscp, 2);
+
+       /*
+        * Test that setting notify dscp does not affect the other
+        * dscp values.  Check that appropriate values are returned.
+        */
+       dscp = 100;
+       result = dns_peer_settransferdscp(peer, 3);
+       ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+
+       result = dns_peer_getquerydscp(peer, &dscp);
+       ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+       ATF_REQUIRE_EQ(dscp, 1);
+
+       result = dns_peer_getnotifydscp(peer, &dscp);
+       ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+       ATF_REQUIRE_EQ(dscp, 2);
+
+       result = dns_peer_gettransferdscp(peer, &dscp);
+       ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+       ATF_REQUIRE_EQ(dscp, 3);
+
+       dns_peer_detach(&peer);
+       dns_test_end();
+}
+
+/*
+ * Main
+ */
+ATF_TP_ADD_TCS(tp) {
+       ATF_TP_ADD_TC(tp, dscp);
+       return (atf_no_error());
+}