]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
check for in-view zones colliding with other zone definitions; also check the syntax...
authorMark Andrews <marka@isc.org>
Mon, 5 Mar 2018 00:53:18 +0000 (11:53 +1100)
committerMark Andrews <marka@isc.org>
Thu, 8 Mar 2018 00:53:21 +0000 (11:53 +1100)
lib/bind9/check.c

index 3037710e0f763d8fa2ccde19ad835b6c7f50fdbf..48beb59a5d523a09885c21ebd862af3fc65a7425 100644 (file)
@@ -1893,7 +1893,7 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
               cfg_aclconfctx_t *actx, isc_log_t *logctx, isc_mem_t *mctx)
 {
        const char *znamestr;
-       const char *typestr;
+       const char *typestr = NULL;
        unsigned int ztype;
        const cfg_obj_t *zoptions, *goptions = NULL;
        const cfg_obj_t *obj = NULL;
@@ -1937,86 +1937,70 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
        obj = NULL;
        (void)cfg_map_get(zoptions, "in-view", &obj);
        if (obj != NULL) {
-               const cfg_obj_t *fwd = NULL;
-               unsigned int maxopts = 1;
-               (void)cfg_map_get(zoptions, "forward", &fwd);
-               if (fwd != NULL)
-                       maxopts++;
-               fwd = NULL;
-               (void)cfg_map_get(zoptions, "forwarders", &fwd);
-               if (fwd != NULL)
-                       maxopts++;
-               if (cfg_map_count(zoptions) > maxopts) {
+               ztype = CFG_ZONE_INVIEW;
+       } else {
+               obj = NULL;
+               (void)cfg_map_get(zoptions, "type", &obj);
+               if (obj == NULL) {
                        cfg_obj_log(zconfig, logctx, ISC_LOG_ERROR,
-                                   "zone '%s': 'in-view' used "
-                                   "with incompatible zone options",
-                                   znamestr);
+                                   "zone '%s': type not present", znamestr);
                        return (ISC_R_FAILURE);
                }
-               return (ISC_R_SUCCESS);
-       }
-
-       obj = NULL;
-       (void)cfg_map_get(zoptions, "type", &obj);
-       if (obj == NULL) {
-               cfg_obj_log(zconfig, logctx, ISC_LOG_ERROR,
-                           "zone '%s': type not present", znamestr);
-               return (ISC_R_FAILURE);
-       }
-
-       typestr = cfg_obj_asstring(obj);
-       if (strcasecmp(typestr, "master") == 0 ||
-           strcasecmp(typestr, "primary") == 0)
-       {
-               ztype = CFG_ZONE_MASTER;
-       } else if (strcasecmp(typestr, "slave") == 0 ||
-                  strcasecmp(typestr, "secondary") == 0)
-       {
-               ztype = CFG_ZONE_SLAVE;
-       } else if (strcasecmp(typestr, "stub") == 0) {
-               ztype = CFG_ZONE_STUB;
-       } else if (strcasecmp(typestr, "static-stub") == 0) {
-               ztype = CFG_ZONE_STATICSTUB;
-       } else if (strcasecmp(typestr, "forward") == 0) {
-               ztype = CFG_ZONE_FORWARD;
-       } else if (strcasecmp(typestr, "hint") == 0) {
-               ztype = CFG_ZONE_HINT;
-       } else if (strcasecmp(typestr, "delegation-only") == 0) {
-               ztype = CFG_ZONE_DELEGATION;
-       } else if (strcasecmp(typestr, "redirect") == 0) {
-               ztype = CFG_ZONE_REDIRECT;
-       } else {
-               cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
-                           "zone '%s': invalid type %s",
-                           znamestr, typestr);
-               return (ISC_R_FAILURE);
-       }
-
-       if (ztype == CFG_ZONE_REDIRECT && strcmp(znamestr, ".") != 0) {
-               cfg_obj_log(zconfig, logctx, ISC_LOG_ERROR,
-                           "redirect zones must be called \".\"");
-               return (ISC_R_FAILURE);
-       }
-       obj = cfg_tuple_get(zconfig, "class");
-       if (cfg_obj_isstring(obj)) {
-               isc_textregion_t r;
 
-               DE_CONST(cfg_obj_asstring(obj), r.base);
-               r.length = strlen(r.base);
-               result = dns_rdataclass_fromtext(&zclass, &r);
-               if (result != ISC_R_SUCCESS) {
+               typestr = cfg_obj_asstring(obj);
+               if (strcasecmp(typestr, "master") == 0 ||
+                   strcasecmp(typestr, "primary") == 0)
+               {
+                       ztype = CFG_ZONE_MASTER;
+               } else if (strcasecmp(typestr, "slave") == 0 ||
+                          strcasecmp(typestr, "secondary") == 0)
+               {
+                       ztype = CFG_ZONE_SLAVE;
+               } else if (strcasecmp(typestr, "stub") == 0) {
+                       ztype = CFG_ZONE_STUB;
+               } else if (strcasecmp(typestr, "static-stub") == 0) {
+                       ztype = CFG_ZONE_STATICSTUB;
+               } else if (strcasecmp(typestr, "forward") == 0) {
+                       ztype = CFG_ZONE_FORWARD;
+               } else if (strcasecmp(typestr, "hint") == 0) {
+                       ztype = CFG_ZONE_HINT;
+               } else if (strcasecmp(typestr, "delegation-only") == 0) {
+                       ztype = CFG_ZONE_DELEGATION;
+               } else if (strcasecmp(typestr, "redirect") == 0) {
+                       ztype = CFG_ZONE_REDIRECT;
+               } else {
                        cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
-                                   "zone '%s': invalid class %s",
-                                   znamestr, r.base);
+                                   "zone '%s': invalid type %s",
+                                   znamestr, typestr);
                        return (ISC_R_FAILURE);
                }
-               if (zclass != defclass) {
-                       cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
-                                   "zone '%s': class '%s' does not "
-                                   "match view/default class",
-                                   znamestr, r.base);
+
+               if (ztype == CFG_ZONE_REDIRECT && strcmp(znamestr, ".") != 0) {
+                       cfg_obj_log(zconfig, logctx, ISC_LOG_ERROR,
+                                   "redirect zones must be called \".\"");
                        return (ISC_R_FAILURE);
                }
+               obj = cfg_tuple_get(zconfig, "class");
+               if (cfg_obj_isstring(obj)) {
+                       isc_textregion_t r;
+
+                       DE_CONST(cfg_obj_asstring(obj), r.base);
+                       r.length = strlen(r.base);
+                       result = dns_rdataclass_fromtext(&zclass, &r);
+                       if (result != ISC_R_SUCCESS) {
+                               cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
+                                           "zone '%s': invalid class %s",
+                                           znamestr, r.base);
+                               return (ISC_R_FAILURE);
+                       }
+                       if (zclass != defclass) {
+                               cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
+                                           "zone '%s': class '%s' does not "
+                                           "match view/default class",
+                                           znamestr, r.base);
+                               return (ISC_R_FAILURE);
+                       }
+               }
        }
 
        /*
@@ -2053,6 +2037,28 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
                        ula = ISC_TRUE;
        }
 
+       if (ztype == CFG_ZONE_INVIEW) {
+               const cfg_obj_t *fwd = NULL;
+               unsigned int maxopts = 1;
+
+               (void)cfg_map_get(zoptions, "forward", &fwd);
+               if (fwd != NULL)
+                       maxopts++;
+               fwd = NULL;
+               (void)cfg_map_get(zoptions, "forwarders", &fwd);
+               if (fwd != NULL)
+                       maxopts++;
+               if (cfg_map_count(zoptions) > maxopts) {
+                       cfg_obj_log(zconfig, logctx, ISC_LOG_ERROR,
+                                   "zone '%s': 'in-view' used "
+                                   "with incompatible zone options",
+                                   znamestr);
+                       if (result == ISC_R_SUCCESS)
+                               result = ISC_R_FAILURE;
+               }
+               return (result);
+       }
+
        /*
         * Check if value is zero.
         */