diff --git a/etc/smartdns/smartdns.conf b/etc/smartdns/smartdns.conf index 5375dfb..b1b0ae5 100644 --- a/etc/smartdns/smartdns.conf +++ b/etc/smartdns/smartdns.conf @@ -48,9 +48,9 @@ cache-size 512 # dualstack-ip-selection yes # edns client subnet -# edns-client-subnet-ipv4 [ip/subnet] -# edns-client-subnet-ipv6 [ip/subnet] -# edns-client-subnet-ipv4 192.168.1.1/24 +# edns-client-subnet [ip/subnet] +# edns-client-subnet 192.168.1.1/24 +# edns-client-subnet [8::8]/56 # ttl for all resource record # rr-ttl: ttl for all record diff --git a/src/dns_conf.c b/src/dns_conf.c index b0a496d..20fd222 100644 --- a/src/dns_conf.c +++ b/src/dns_conf.c @@ -430,13 +430,15 @@ int config_address(void *data, int argc, char *argv[]) memcpy(domain, begin, len); domain[len] = 0; - if (strncmp(end + 1, "#", sizeof("#")) == 0) { + if (*(end + 1) == '#') { if (strncmp(end + 1, "#4", sizeof("#4")) == 0) { flag = DOMAIN_FLAG_ADDR_IPV4_SOA; } else if (strncmp(end + 1, "#6", sizeof("#6")) == 0) { flag = DOMAIN_FLAG_ADDR_IPV6_SOA; - } else { + } else if (strncmp(end + 1, "#", sizeof("#")) == 0) { flag = DOMAIN_FLAG_ADDR_SOA; + } else { + goto errout; } if (config_domain_rule_flag_set(domain, flag) != 0 ) { @@ -444,13 +446,15 @@ int config_address(void *data, int argc, char *argv[]) } return 0; - } else if (strncmp(end + 1, "-", sizeof("-")) == 0) { + } else if (*(end + 1) == '-') { if (strncmp(end + 1, "-4", sizeof("-4")) == 0) { flag = DOMAIN_FLAG_ADDR_IPV4_IGN; } else if (strncmp(end + 1, "-6", sizeof("-6")) == 0) { flag = DOMAIN_FLAG_ADDR_IPV6_IGN; - } else { + } else if (strncmp(end + 1, "-", sizeof("-")) == 0) { flag = DOMAIN_FLAG_ADDR_IGN; + } else { + goto errout; } if (config_domain_rule_flag_set(domain, flag) != 0 ) { @@ -629,7 +633,7 @@ int conf_edns_client_subnet(void *data, int argc, char *argv[]) char *slash = NULL; char *value = NULL; int subnet = 0; - struct dns_edns_client_subnet *ecs = data; + struct dns_edns_client_subnet *ecs = NULL; struct sockaddr_storage addr; socklen_t addr_len = sizeof(addr); @@ -653,6 +657,17 @@ int conf_edns_client_subnet(void *data, int argc, char *argv[]) goto errout; } + switch (addr.ss_family) { + case AF_INET: + ecs = &dns_conf_ipv4_ecs; + break; + case AF_INET6: + ecs = &dns_conf_ipv6_ecs; + break; + default: + goto errout; + } + strncpy(ecs->ip, value, DNS_MAX_IPLEN); ecs->subnet = subnet; ecs->enable = 1; @@ -712,8 +727,7 @@ struct config_item config_item[] = { CONF_CUSTOM("blacklist-ip", config_blacklist_ip, NULL), CONF_CUSTOM("bogus-nxdomain", conf_bogus_nxdomain, NULL), CONF_CUSTOM("ignore-ip", conf_ip_ignore, NULL), - CONF_CUSTOM("edns-client-subnet-ipv4", conf_edns_client_subnet, &dns_conf_ipv6_ecs), - CONF_CUSTOM("edns-client-subnet-ipv6", conf_edns_client_subnet, &dns_conf_ipv6_ecs), + CONF_CUSTOM("edns-client-subnet", conf_edns_client_subnet, NULL), CONF_CUSTOM("conf-file", config_addtional_file, NULL), CONF_END(), };