]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
- Fix #1269: inconsistent use of built-in local zones with views.
authorRalph Dolmans <ralph@nlnetlabs.nl>
Tue, 30 May 2017 13:04:19 +0000 (13:04 +0000)
committerRalph Dolmans <ralph@nlnetlabs.nl>
Tue, 30 May 2017 13:04:19 +0000 (13:04 +0000)
- Add defaults for new local-zone trees added to views using unbound-control.

git-svn-id: file:///svn/unbound/trunk@4199 be551aaa-1e26-0410-a405-d3ace91eadb9

daemon/remote.c
doc/Changelog
services/localzone.c
services/localzone.h
services/view.c
util/config_file.c
util/config_file.h

index 01663fad608a23cc8c9d90c3a4f023dff97a2a7d..fb2fec6daab4397a8438b5e735672b768a35b543 100644 (file)
@@ -1393,6 +1393,14 @@ do_view_zone_add(SSL* ssl, struct worker* worker, char* arg)
                        ssl_printf(ssl,"error out of memory\n");
                        return;
                }
+               if(!v->isfirst) {
+                       /* Global local-zone is not used for this view,
+                        * therefore add defaults to this view-specic
+                        * local-zone. */
+                       struct config_file lz_cfg;
+                       memset(&lz_cfg, 0, sizeof(lz_cfg));
+                       local_zone_enter_defaults(v->local_zones, &lz_cfg);
+               }
        }
        do_zone_add(ssl, v->local_zones, arg2);
        lock_rw_unlock(&v->lock);
index 291a13ec140d68f44c8d8a8129f8f475b9fe7cd1..d5fe23eeacb1372cc5cc70391dbcbba9cdd0f2cf 100644 (file)
@@ -1,3 +1,8 @@
+30 May 2017: Ralph
+       - Fix #1269: inconsistent use of built-in local zones with views.
+       - Add defaults for new local-zone trees added to views using
+         unbound-control.
+
 30 May 2017: Wouter
        - Support for openssl EVP_DigestVerify.
        - Support for the ED25519 algorithm with openssl (from openssl 1.1.1).
index 9b83081d15952e027224d9889fc396d17e25be72..3ab1ce8618af261168f811e9f372f8dafbd4ab1b 100644 (file)
@@ -746,12 +746,15 @@ add_as112_default(struct local_zones* zones, struct config_file* cfg,
 }
 
 /** enter default zones */
-static int
-lz_enter_defaults(struct local_zones* zones, struct config_file* cfg)
+int local_zone_enter_defaults(struct local_zones* zones, struct config_file* cfg)
 {
        struct local_zone* z;
        const char** zstr;
 
+       /* Do not add any default */
+       if(cfg->local_zones_disable_default)
+               return 1;
+
        /* this list of zones is from RFC 6303 and RFC 7686 */
 
        /* block localhost level zones first, then onion and later the LAN zones */
@@ -1021,7 +1024,7 @@ local_zones_apply_cfg(struct local_zones* zones, struct config_file* cfg)
                return 0;
        }
        /* apply default zones+content (unless disabled, or overridden) */
-       if(!lz_enter_defaults(zones, cfg)) {
+       if(!local_zone_enter_defaults(zones, cfg)) {
                return 0;
        }
        /* enter local zone overrides */
@@ -1672,6 +1675,8 @@ int local_zone_str2type(const char* type, enum localzone_type* t)
                *t = local_zone_always_refuse;
        else if(strcmp(type, "always_nxdomain") == 0)
                *t = local_zone_always_nxdomain;
+       else if(strcmp(type, "nodefault") == 0)
+               *t = local_zone_nodefault;
        else return 0;
        return 1;
 }
index 658f28024ef4d16f2edd5a51b29cca5454f6f6bc..fcdad41666d2c9074824c8f269c86cad6a159353 100644 (file)
@@ -427,6 +427,15 @@ enum localzone_type local_data_find_tag_action(const uint8_t* taglist,
        const uint8_t* tagactions, size_t tagactionssize,
        enum localzone_type lzt, int* tag, char* const* tagname, int num_tags);
 
+/**
+ * Enter defaults to local zone.
+ * @param zones: to add defaults to
+ * @param cfg: containing list of zones to exclude from default set.
+ * @return 1 on success; 0 otherwise.
+ */
+int local_zone_enter_defaults(struct local_zones* zones,
+       struct config_file* cfg);
+
 /**
   * Parses resource record string into wire format, also returning its field values.
   * @param str: input resource record
index 33f4f4986ba7e4d98d7aa8acd4f315a466b84f1c..e7b3d692e15a97a2aa8be95908a7c27365019783 100644 (file)
@@ -167,6 +167,22 @@ views_apply_cfg(struct views* vs, struct config_file* cfg)
                        lz_cfg.local_data = cv->local_data;
                        lz_cfg.local_zones_nodefault =
                                cv->local_zones_nodefault;
+                       if(v->isfirst) {
+                               /* Do not add defaults to view-specific
+                                * local-zone when global local zone will be
+                                * used. */
+                               struct config_strlist* nd;
+                               lz_cfg.local_zones_disable_default = 1;
+                               /* Add nodefault zones to list of zones to add,
+                                * so they will be used as if they are
+                                * configured as type transparent */
+                               for(nd = cv->local_zones_nodefault; nd;
+                                       nd = nd->next) {
+                                       cfg_str2list_insert(&lz_cfg.local_zones,
+                                               strdup(nd->str),
+                                               strdup("nodefault"));
+                               }
+                       }
                        if(!local_zones_apply_cfg(v->local_zones, &lz_cfg)){
                                lock_rw_unlock(&v->lock);
                                return 0;
index 0904b40892748077bccaadda866ebd20bb7934e5..8fd6181c5c9e77dfb2a46be53adbd3c778dac598 100644 (file)
@@ -228,6 +228,7 @@ config_create(void)
        cfg->neg_cache_size = 1 * 1024 * 1024;
        cfg->local_zones = NULL;
        cfg->local_zones_nodefault = NULL;
+       cfg->local_zones_disable_default = 0;
        cfg->local_data = NULL;
        cfg->local_zone_overrides = NULL;
        cfg->unblock_lan_zones = 0;
index 9ccd6f1179f393fc2d14bb9e2146210395d16d1a..d97cfde312e2a5156e7bd8db60a302ee989ef842 100644 (file)
@@ -319,6 +319,8 @@ struct config_file {
        struct config_str2list* local_zones;
        /** local zones nodefault list */
        struct config_strlist* local_zones_nodefault;
+       /** do not add any default local zone */
+       int local_zones_disable_default;
        /** local data RRs configured */
        struct config_strlist* local_data;
        /** local zone override types per netblock */