]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Fix zone count check to only occur on RPZ zones
authorMukund Sivaraman <muks@isc.org>
Fri, 9 Mar 2018 09:41:51 +0000 (15:11 +0530)
committerOndřej Surý <ondrej@sury.org>
Sun, 18 Mar 2018 10:08:22 +0000 (10:08 +0000)
lib/bind9/check.c

index 0d39db10a3af6b0a78d14d0797c78e0b7a2315cf..a17359e3a2fb97271ab365fefc7bfeb070219306 100644 (file)
@@ -3128,9 +3128,15 @@ check_trusted_key(const cfg_obj_t *key, isc_boolean_t managed,
        return (result);
 }
 
+typedef enum {
+       special_zonetype_rpz,
+       special_zonetype_catz
+} special_zonetype_t;
+
 static isc_result_t
 check_rpz_catz(const char *rpz_catz, const cfg_obj_t *rpz_obj,
-              const char *viewname, isc_symtab_t *symtab, isc_log_t *logctx)
+              const char *viewname, isc_symtab_t *symtab, isc_log_t *logctx,
+              special_zonetype_t specialzonetype)
 {
        const cfg_listelt_t *element;
        const cfg_obj_t *obj, *nameobj, *zoneobj;
@@ -3157,18 +3163,20 @@ check_rpz_catz(const char *rpz_catz, const cfg_obj_t *rpz_obj,
             element != NULL;
             element = cfg_list_next(element))
        {
-               if (++num_zones > 64) {
-                       cfg_obj_log(nameobj, logctx, ISC_LOG_ERROR,
-                                   "more than 64 response policy zones "
-                                   "in view '%s'", viewname);
-                       return (ISC_R_FAILURE);
-               }
-
                obj = cfg_listelt_value(element);
                nameobj = cfg_tuple_get(obj, "zone name");
                zonename = cfg_obj_asstring(nameobj);
                zonetype = "";
 
+               if (specialzonetype == special_zonetype_rpz) {
+                       if (++num_zones > 64) {
+                               cfg_obj_log(nameobj, logctx, ISC_LOG_ERROR,
+                                           "more than 64 response policy "
+                                           "zones in view '%s'", viewname);
+                               return (ISC_R_FAILURE);
+                       }
+               }
+
                tresult = dns_name_fromstring(name, zonename, 0, NULL);
                if (tresult != ISC_R_SUCCESS) {
                        cfg_obj_log(nameobj, logctx, ISC_LOG_ERROR,
@@ -3288,15 +3296,24 @@ check_viewconf(const cfg_obj_t *config, const cfg_obj_t *voptions,
         */
        if (opts != NULL) {
                obj = NULL;
-               if (cfg_map_get(opts, "response-policy", &obj) == ISC_R_SUCCESS
-                   && check_rpz_catz("response-policy zone", obj,
-                                viewname, symtab, logctx) != ISC_R_SUCCESS)
+               if ((cfg_map_get(opts, "response-policy",
+                                &obj) == ISC_R_SUCCESS) &&
+                   (check_rpz_catz("response-policy zone", obj,
+                                   viewname, symtab, logctx,
+                                   special_zonetype_rpz) != ISC_R_SUCCESS))
+               {
                        result = ISC_R_FAILURE;
+               }
+
                obj = NULL;
-               if (cfg_map_get(opts, "catalog-zones", &obj) == ISC_R_SUCCESS
-                   && check_rpz_catz("catalog zone", obj,
-                                 viewname, symtab, logctx) != ISC_R_SUCCESS)
+               if ((cfg_map_get(opts, "catalog-zones",
+                                &obj) == ISC_R_SUCCESS) &&
+                   (check_rpz_catz("catalog zone", obj,
+                                   viewname, symtab, logctx,
+                                   special_zonetype_catz) != ISC_R_SUCCESS))
+               {
                        result = ISC_R_FAILURE;
+               }
        }
 
        isc_symtab_destroy(&symtab);