]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
1612. [bug] check-names at the option/view level could trigger
authorMark Andrews <marka@isc.org>
Tue, 20 Apr 2004 14:11:47 +0000 (14:11 +0000)
committerMark Andrews <marka@isc.org>
Tue, 20 Apr 2004 14:11:47 +0000 (14:11 +0000)
                        an INSIST. [RT# 11116]

CHANGES
bin/named/config.c
bin/named/include/named/config.h
bin/named/server.c
bin/named/zoneconf.c

diff --git a/CHANGES b/CHANGES
index 537428e6554d2e30961a05cd2f4fec32269c7998..4e86a673dcbb8923766553672fea18d6446bbcc9 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -18,7 +18,8 @@
                        Missing #ifdef ISC_PLATFORM_HAVEIFNAMETOINDEX/#endif.
                        [RT #11119]
 
-1612.  [placeholder]   rt11116
+1612.  [bug]           check-names at the option/view level could trigger
+                       an INSIST. [RT# 11116]
 
 1611.  [bug]           solaris: IPv6 interface scanning failed to cope with
                        no active IPv6 interfaces.
index c761833734f7cefa4fd0b6d017989db5a89e1c22..4a9961940d96b353a49c9708e889a27cb7ca24a1 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: config.c,v 1.48 2004/04/19 23:09:51 marka Exp $ */
+/* $Id: config.c,v 1.49 2004/04/20 14:11:46 marka Exp $ */
 
 #include <config.h>
 
@@ -195,7 +195,7 @@ ns_config_parsedefaults(cfg_parser_t *parser, cfg_obj_t **conf) {
 }
 
 isc_result_t
-ns_config_get(cfg_obj_t **maps, const charname, cfg_obj_t **obj) {
+ns_config_get(cfg_obj_t **maps, const char *name, cfg_obj_t **obj) {
        int i;
 
        for (i = 0;; i++) {
@@ -206,6 +206,41 @@ ns_config_get(cfg_obj_t **maps, const char* name, cfg_obj_t **obj) {
        }
 }
 
+isc_result_t
+ns_checknames_get(cfg_obj_t **maps, const char *which, cfg_obj_t **obj) {
+       cfg_listelt_t *element;
+       cfg_obj_t *checknames;
+       cfg_obj_t *type;
+       cfg_obj_t *value;
+       int i;
+
+       for (i = 0;; i++) {
+               if (maps[i] == NULL)
+                       return (ISC_R_NOTFOUND);
+               checknames = NULL;
+               if (cfg_map_get(maps[i], "check-names", &checknames) == ISC_R_SUCCESS) {
+                       /*
+                        * Zone map entry is not a list.
+                        */
+                       if (checknames != NULL && !cfg_obj_islist(checknames)) {
+                               *obj = checknames;
+                               return (ISC_R_SUCCESS);
+                       }
+                       for (element = cfg_list_first(checknames);
+                            element != NULL;
+                            element = cfg_list_next(element)) {
+                               value = cfg_listelt_value(element);
+                               type = cfg_tuple_get(value, "type");
+                               if (strcasecmp(cfg_obj_asstring(type), which) == 0) {
+                                       *obj = cfg_tuple_get(value, "mode");
+                                       return (ISC_R_SUCCESS);
+                               }
+                       }
+
+               }
+       }
+}
+
 int
 ns_config_listcount(cfg_obj_t *list) {
        cfg_listelt_t *e;
index 1e797f39ed6337578e9759516ffa0b375cbac97a..083d3eb0af1bc827f487f0b7f0a70d0f95e02d6b 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: config.h,v 1.6 2004/03/05 04:57:55 marka Exp $ */
+/* $Id: config.h,v 1.7 2004/04/20 14:11:47 marka Exp $ */
 
 #ifndef NAMED_CONFIG_H
 #define NAMED_CONFIG_H 1
@@ -31,6 +31,9 @@ ns_config_parsedefaults(cfg_parser_t *parser, cfg_obj_t **conf);
 isc_result_t
 ns_config_get(cfg_obj_t **maps, const char* name, cfg_obj_t **obj);
 
+isc_result_t
+ns_checknames_get(cfg_obj_t **maps, const char* name, cfg_obj_t **obj);
+
 int
 ns_config_listcount(cfg_obj_t *list);
 
index 19257f0fff2f6a8a685460f5784d2928bee99f53..606726a1412ca7d2abaed289c61f19c6fb08235a 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: server.c,v 1.424 2004/04/20 07:16:23 marka Exp $ */
+/* $Id: server.c,v 1.425 2004/04/20 14:11:46 marka Exp $ */
 
 #include <config.h>
 
@@ -399,7 +399,7 @@ mustbesecure(cfg_obj_t *mbs, dns_resolver_t *resolver)
                isc_buffer_init(&b, str, strlen(str));
                isc_buffer_add(&b, strlen(str));
                CHECK(dns_name_fromtext(name, &b, dns_rootname,
-                                       ISC_FALSE, NULL));
+                                       ISC_FALSE, NULL));
                value = cfg_obj_asboolean(cfg_tuple_get(obj, "value"));
                CHECK(dns_resolver_setmustbesecure(resolver, name, value));
        }
@@ -857,33 +857,22 @@ configure_view(dns_view_t *view, cfg_obj_t *config, cfg_obj_t *vconfig,
         * Check-names.
         */
        obj = NULL;
-       str = "";
-       result = ns_config_get(maps, "check-names", &obj);
+       result = ns_checknames_get(maps, "response", &obj);
        INSIST(result == ISC_R_SUCCESS);
-       for (element = cfg_list_first(obj);
-            element != NULL;
-            element = cfg_list_next(element)) {
-               cfg_obj_t *value, *type;
-               value = cfg_listelt_value(element);
-               type = cfg_tuple_get(value, "type");
-               if (strcasecmp(cfg_obj_asstring(type), "response") == 0) {
-                       str = cfg_obj_asstring(cfg_tuple_get(value, "mode"));
-                       break;
-               }
-       }
 
-        if (strcasecmp(str, "fail") == 0) {
-                check = DNS_RESOLVER_CHECKNAMES |
+       str = cfg_obj_asstring(obj);
+       if (strcasecmp(str, "fail") == 0) {
+               check = DNS_RESOLVER_CHECKNAMES |
                        DNS_RESOLVER_CHECKNAMESFAIL;
                view->checknames = ISC_TRUE;
-        } else if (strcasecmp(str, "warn") == 0) {
-                check = DNS_RESOLVER_CHECKNAMES;
+       } else if (strcasecmp(str, "warn") == 0) {
+               check = DNS_RESOLVER_CHECKNAMES;
                view->checknames = ISC_FALSE;
-        } else if (strcasecmp(str, "ignore") == 0) {
+       } else if (strcasecmp(str, "ignore") == 0) {
                check = 0;
                view->checknames = ISC_FALSE;
        } else
-                INSIST(0);
+               INSIST(0);
 
        /*
         * Resolver.
@@ -1199,7 +1188,7 @@ configure_view(dns_view_t *view, cfg_obj_t *config, cfg_obj_t *vconfig,
         */
        if (view->enablednssec) {
                CHECK(configure_view_dnsseckeys(vconfig, config, mctx,
-                                               &view->secroots));
+                                               &view->secroots));
                dns_resolver_resetmustbesecure(view->resolver);
                obj = NULL;
                result = ns_config_get(maps, "dnssec-must-be-secure", &obj);
@@ -1229,7 +1218,7 @@ configure_view(dns_view_t *view, cfg_obj_t *config, cfg_obj_t *vconfig,
                        view->preferred_glue = dns_rdatatype_aaaa;
                else
                        view->preferred_glue = 0;
-        } else
+       } else
                view->preferred_glue = 0;
 
        obj = NULL;
@@ -1950,7 +1939,7 @@ adjust_interfaces(ns_server_t *server, isc_mem_t *mctx) {
  */
 static void
 interface_timer_tick(isc_task_t *task, isc_event_t *event) {
-        isc_result_t result;
+       isc_result_t result;
        ns_server_t *server = (ns_server_t *) event->ev_arg;
        INSIST(task == server->task);
        UNUSED(task);
@@ -2146,7 +2135,7 @@ load_configuration(const char *filename, ns_server_t *server,
         * option where the above parsing failed, parse resolv.conf.
         */
        if (ns_g_lwresdonly &&
-            (lwresd_g_useresolvconf ||
+           (lwresd_g_useresolvconf ||
             (!ns_g_conffileset && result == ISC_R_FILENOTFOUND)))
        {
                isc_log_write(ns_g_lctx,
@@ -3123,29 +3112,29 @@ ns_add_reserved_dispatch(ns_server_t *server, isc_sockaddr_t *addr) {
        dispatch->dispatchgen = server->dispatchgen;
        dispatch->dispatch = NULL;
 
-        attrs = 0;
-        attrs |= DNS_DISPATCHATTR_UDP;
-        switch (isc_sockaddr_pf(addr)) {
-        case AF_INET:
-                attrs |= DNS_DISPATCHATTR_IPV4;
-                break;
-        case AF_INET6:
-                attrs |= DNS_DISPATCHATTR_IPV6;
-                break;
+       attrs = 0;
+       attrs |= DNS_DISPATCHATTR_UDP;
+       switch (isc_sockaddr_pf(addr)) {
+       case AF_INET:
+               attrs |= DNS_DISPATCHATTR_IPV4;
+               break;
+       case AF_INET6:
+               attrs |= DNS_DISPATCHATTR_IPV6;
+               break;
        default:
                result = ISC_R_NOTIMPLEMENTED;
                goto cleanup;
-        }
-        attrmask = 0;
-        attrmask |= DNS_DISPATCHATTR_UDP;
-        attrmask |= DNS_DISPATCHATTR_TCP;
-        attrmask |= DNS_DISPATCHATTR_IPV4;
-        attrmask |= DNS_DISPATCHATTR_IPV6;
+       }
+       attrmask = 0;
+       attrmask |= DNS_DISPATCHATTR_UDP;
+       attrmask |= DNS_DISPATCHATTR_TCP;
+       attrmask |= DNS_DISPATCHATTR_IPV4;
+       attrmask |= DNS_DISPATCHATTR_IPV6;
 
        result = dns_dispatch_getudp(ns_g_dispatchmgr, ns_g_socketmgr,
-                                     ns_g_taskmgr, &dispatch->addr, 4096,
-                                     1000, 32768, 16411, 16433,
-                                     attrs, attrmask, &dispatch->dispatch); 
+                                    ns_g_taskmgr, &dispatch->addr, 4096,
+                                    1000, 32768, 16411, 16433,
+                                    attrs, attrmask, &dispatch->dispatch); 
        if (result != ISC_R_SUCCESS)
                goto cleanup;
 
index 3121dd61dc6a9b8afac5c8089c0896bb1475c5f8..36a4ee84dd37899e7d26e6a622bb3bf705051c39 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: zoneconf.c,v 1.111 2004/03/30 02:13:43 marka Exp $ */
+/* $Id: zoneconf.c,v 1.112 2004/04/20 14:11:46 marka Exp $ */
 
 #include <config.h>
 
@@ -295,11 +295,7 @@ strtoargv(isc_mem_t *mctx, char *s, unsigned int *argcp, char ***argvp) {
 static void
 checknames(dns_zonetype_t ztype, cfg_obj_t **maps, cfg_obj_t **objp) {
        const char *zone = NULL;
-       cfg_listelt_t *element;
-       cfg_obj_t *type;
-       cfg_obj_t *value;
-       cfg_obj_t *check;
-       int i;
+       isc_result_t result;
 
        switch (ztype) {
        case dns_zone_slave: zone = "slave"; break;
@@ -307,24 +303,8 @@ checknames(dns_zonetype_t ztype, cfg_obj_t **maps, cfg_obj_t **objp) {
        default:
                INSIST(0);
        }
-       for (i = 0; maps[i] != NULL; i++) {
-               check = NULL;
-               cfg_map_get(maps[i], "check-names", &check);
-               if (check != NULL && !cfg_obj_islist(check)) {
-                       *objp = check;
-                       return;
-               }
-               for (element = cfg_list_first(check);
-                    element != NULL;
-                    element = cfg_list_next(element)) {
-                       value = cfg_listelt_value(element);
-                       type = cfg_tuple_get(value, "type");
-                       if (strcasecmp(cfg_obj_asstring(type), zone) == 0) {
-                               *objp = cfg_tuple_get(value, "mode");
-                               return;
-                       }
-               }
-       }
+       result = ns_checknames_get(maps, zone, objp);
+       INSIST(result == ISC_R_SUCCESS);
 }
 
 isc_result_t