From 97f5d3d28ea61d0271510e4a4c45342d6c50b1bc Mon Sep 17 00:00:00 2001 From: Wouter Wijngaards Date: Fri, 11 Jan 2008 11:24:30 +0000 Subject: [PATCH] more checks by checkconf. git-svn-id: file:///svn/unbound/trunk@842 be551aaa-1e26-0410-a405-d3ace91eadb9 --- doc/Changelog | 2 + iterator/iter_hints.c | 1 - smallapp/unbound-checkconf.c | 83 ++++++++++++++++++++++++++++++----- testdata/04-checkconf.tpkg | Bin 4642 -> 4735 bytes util/net_help.c | 4 -- 5 files changed, 73 insertions(+), 17 deletions(-) diff --git a/doc/Changelog b/doc/Changelog index 6fef02baa..52c4465fd 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -1,6 +1,8 @@ 11 January 2008: Wouter - man page, warning removed. - added text describing the use of stub zones for private zones. + - checkconf tests for bad hostnames (IP address), and for doubled + interface lines. 10 January 2008: Wouter - typo in example.conf. diff --git a/iterator/iter_hints.c b/iterator/iter_hints.c index 024ad96c9..b7b99f906 100644 --- a/iterator/iter_hints.c +++ b/iterator/iter_hints.c @@ -434,7 +434,6 @@ hints_apply_cfg(struct iter_hints* hints, struct config_file* cfg) return 0; if(!hints_insert(hints, LDNS_RR_CLASS_IN, dp)) return 0; - delegpt_log(VERB_DETAIL, dp); } init_parents(hints); diff --git a/smallapp/unbound-checkconf.c b/smallapp/unbound-checkconf.c index 074b6a67d..f605380c3 100644 --- a/smallapp/unbound-checkconf.c +++ b/smallapp/unbound-checkconf.c @@ -86,20 +86,58 @@ check_mod(struct config_file* cfg, struct module_func_block* fb) regional_destroy(env.scratch); } -/** check configuration for errors */ +/** check localzones */ static void -morechecks(struct config_file* cfg) +localzonechecks(struct config_file* cfg) +{ + struct local_zones* zs; + if(!(zs = local_zones_create())) + fatal_exit("out of memory"); + if(!local_zones_apply_cfg(zs, cfg)) + fatal_exit("failed local-zone, local-data configuration"); + local_zones_delete(zs); +} + +/** emit warnings for IP in hosts */ +static void +warn_hosts(const char* typ, struct config_stub* list) { - int i; struct sockaddr_storage a; socklen_t alen; - struct config_str2list* acl; - struct local_zones* zs; + struct config_stub* s; + struct config_strlist* h; + for(s=list; s; s=s->next) { + for(h=s->hosts; h; h=h->next) { + if(extstrtoaddr(h->str, &a, &alen)) { + fprintf(stderr, "unbound-checkconf: warning:" + " %s %s: \"%s\" is an IP%s address, " + "and when looked up as a host name " + "during use may not resolve.\n", + s->name, typ, h->str, + addr_is_ip6(&a, alen)?"6":"4"); + } + } + } +} + +/** check interface strings */ +static void +interfacechecks(struct config_file* cfg) +{ + struct sockaddr_storage a; + socklen_t alen; + int i, j; for(i=0; inum_ifs; i++) { if(!ipstrtoaddr(cfg->ifs[i], UNBOUND_DNS_PORT, &a, &alen)) { fatal_exit("cannot parse interface specified as '%s'", cfg->ifs[i]); } + for(j=0; jnum_ifs; j++) { + if(i!=j && strcmp(cfg->ifs[i], cfg->ifs[j])==0) + fatal_exit("interface: %s present twice, " + "cannot bind same ports twice.", + cfg->ifs[i]); + } } for(i=0; inum_out_ifs; i++) { if(!ipstrtoaddr(cfg->out_ifs[i], UNBOUND_DNS_PORT, @@ -107,14 +145,40 @@ morechecks(struct config_file* cfg) fatal_exit("cannot parse outgoing-interface " "specified as '%s'", cfg->out_ifs[i]); } + for(j=0; jnum_out_ifs; j++) { + if(i!=j && strcmp(cfg->out_ifs[i], cfg->out_ifs[j])==0) + fatal_exit("outgoing-interface: %s present " + "twice, cannot bind same ports twice.", + cfg->out_ifs[i]); + } } +} + +/** check acl ips */ +static void +aclchecks(struct config_file* cfg) +{ + int d; + struct sockaddr_storage a; + socklen_t alen; + struct config_str2list* acl; for(acl=cfg->acls; acl; acl = acl->next) { if(!netblockstrtoaddr(acl->str, UNBOUND_DNS_PORT, &a, &alen, - &i)) { + &d)) { fatal_exit("cannot parse access control address %s %s", acl->str, acl->str2); } } +} + +/** check configuration for errors */ +static void +morechecks(struct config_file* cfg) +{ + warn_hosts("stub-host", cfg->stubs); + warn_hosts("forward-host", cfg->forwards); + interfacechecks(cfg); + aclchecks(cfg); if(cfg->verbosity < 0) fatal_exit("verbosity value < 0"); @@ -152,12 +216,7 @@ morechecks(struct config_file* cfg) endpwent(); } - if(!(zs = local_zones_create())) - fatal_exit("out of memory"); - if(!local_zones_apply_cfg(zs, cfg)) - fatal_exit("failed local-zone, local-data configuration"); - local_zones_print(zs); /* @@@ DEBUG */ - local_zones_delete(zs); + localzonechecks(cfg); } /** check config file */ diff --git a/testdata/04-checkconf.tpkg b/testdata/04-checkconf.tpkg index d01b6410c5a967745b01cc2c46e7b4c165cf4bb9..ab98b86f4d056ce954ec4cccb3acba5dbe2d3afe 100644 GIT binary patch literal 4735 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 NzW^1Q3j+X9002%aNK^m- literal 4642 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 MAX_ADDR_STRLEN) { - log_err("address too long: '%s'", str); return 0; } strncpy(buf, str, MAX_ADDR_STRLEN); buf[s-str] = 0; port = atoi(s+1); if(port == 0 && strcmp(s+1,"0")!=0) { - log_err("bad port spec in address: '%s", str); return 0; } return ipstrtoaddr(buf, port, addr, addrlen); @@ -212,7 +210,6 @@ ipstrtoaddr(const char* ip, int port, struct sockaddr_storage* addr, sa->sin6_family = AF_INET6; sa->sin6_port = (in_port_t)htons(p); if(inet_pton((int)sa->sin6_family, ip, &sa->sin6_addr) <= 0) { - log_err("Bad ip6 address %s", ip); return 0; } } else { /* ip4 */ @@ -222,7 +219,6 @@ ipstrtoaddr(const char* ip, int port, struct sockaddr_storage* addr, sa->sin_family = AF_INET; sa->sin_port = (in_port_t)htons(p); if(inet_pton((int)sa->sin_family, ip, &sa->sin_addr) <= 0) { - log_err("Bad ip4 address %s", ip); return 0; } } -- 2.47.2