]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
2324. [bug] Fix IPv6 matching against "any;" [RT #17533]
authorMark Andrews <marka@isc.org>
Sun, 27 Jan 2008 02:13:34 +0000 (02:13 +0000)
committerMark Andrews <marka@isc.org>
Sun, 27 Jan 2008 02:13:34 +0000 (02:13 +0000)
CHANGES
lib/dns/acl.c
lib/isc/radix.c

diff --git a/CHANGES b/CHANGES
index 1548500535e2f43e48591ae272e7bcd2271d4866..206ebade6d720c79bc3e85a28e602f60fea6e6ad 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,5 @@
+2324.  [bug]           Fix IPv6 matching against "any;" [RT #17533]
+
 2323.  [port]          tru64: namespace clash. [RT #17547]
 
 2322.  [port]          MacOS: work around the limitation of setrlimit()
index fd91a4e923f50631c1e1f8556d8e1911edfe9883..f6160b70ac8ce4d3a5e3e76ac13fcf1299ef534f 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: acl.c,v 1.43 2008/01/22 05:37:49 each Exp $ */
+/* $Id: acl.c,v 1.44 2008/01/27 02:13:34 marka Exp $ */
 
 /*! \file */
 
@@ -220,6 +220,8 @@ dns_acl_match(const isc_netaddr_t *reqaddr,
 
        /* Found a match. */
        if (result == ISC_R_SUCCESS && node != NULL) {
+               if (node->bit == 0)
+                       family = AF_INET;
                match_num = node->node_num[ISC_IS6(family)];
                if (*(isc_boolean_t *) node->data[ISC_IS6(family)] == ISC_TRUE)
                        *match = match_num;
index ce332146c91f3f4010d6c56f417257e5a0026ad2..989ca436ae5b3876082b016c304798466d153469 100644 (file)
@@ -14,7 +14,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: radix.c,v 1.11 2008/01/21 23:46:56 tbox Exp $ */
+/* $Id: radix.c,v 1.12 2008/01/27 02:13:34 marka Exp $ */
 
 /*
  * This source was adapted from MRT's RCS Ids:
@@ -233,7 +233,7 @@ isc_radix_search(isc_radix_tree_t *radix, isc_radix_node_t **target,
        isc_radix_node_t *node;
        isc_radix_node_t *stack[RADIX_MAXBITS + 1];
        u_char *addr;
-       isc_uint32_t bitlen, family;
+       isc_uint32_t bitlen, family, tfamily = -1;
        int cnt = 0;
 
        REQUIRE(radix != NULL);
@@ -250,8 +250,6 @@ isc_radix_search(isc_radix_tree_t *radix, isc_radix_node_t **target,
        addr = isc_prefix_touchar(prefix);
        bitlen = prefix->bitlen;
 
-       /* Bitlen 0 means "any" or "none", which is always treated as IPv4 */
-       family = bitlen ? prefix->family : AF_INET;
 
        while (node->bit < bitlen) {
                if (node->prefix)
@@ -275,11 +273,17 @@ isc_radix_search(isc_radix_tree_t *radix, isc_radix_node_t **target,
                if (_comp_with_mask(isc_prefix_tochar(node->prefix),
                                    isc_prefix_tochar(prefix),
                                    node->prefix->bitlen)) {
+                       /* Bitlen 0 means "any" or "none",
+                          which is always treated as IPv4 */
+                       family = node->prefix->bitlen ?
+                                prefix->family : AF_INET;
                        if (node->node_num[ISC_IS6(family)] != -1 &&
-                           ((*target == NULL) ||
-                            (*target)->node_num[ISC_IS6(family)] >
-                                  node->node_num[ISC_IS6(family)]))
+                                ((*target == NULL) ||
+                                 (*target)->node_num[ISC_IS6(tfamily)] >
+                                  node->node_num[ISC_IS6(family)])) {
                                *target = node;
+                               tfamily = family;
+                       }
                }
        }