diff --git a/src/edns0.c b/src/edns0.c index f1279df..f7d1994 100644 --- a/src/edns0.c +++ b/src/edns0.c @@ -281,8 +281,11 @@ static size_t calc_subnet_opt(struct subnet_opt *opt, union mysockaddr *source) void *addrp; int sa_family = source->sa.sa_family; + opt->source_netmask = 0; + opt->scope_netmask = 0; + #ifdef HAVE_IPV6 - if (source->sa.sa_family == AF_INET6) + if (source->sa.sa_family == AF_INET6 && daemon->add_subnet6) { opt->source_netmask = daemon->add_subnet6->mask; if (daemon->add_subnet6->addr_used) @@ -293,8 +296,9 @@ static size_t calc_subnet_opt(struct subnet_opt *opt, union mysockaddr *source) else addrp = &source->in6.sin6_addr; } - else #endif + + if (source->sa.sa_family == AF_INET && daemon->add_subnet4) { opt->source_netmask = daemon->add_subnet4->mask; if (daemon->add_subnet4->addr_used) @@ -302,26 +306,26 @@ static size_t calc_subnet_opt(struct subnet_opt *opt, union mysockaddr *source) sa_family = daemon->add_subnet4->addr.sa.sa_family; addrp = get_addrp(&daemon->add_subnet4->addr, sa_family); } - else - addrp = &source->in.sin_addr; + else + addrp = &source->in.sin_addr; } - opt->scope_netmask = 0; +#ifdef HAVE_IPV6 + opt->family = htons(sa_family == AF_INET6 ? 2 : 1); +#else + opt->family = htons(1); +#endif + len = 0; if (opt->source_netmask != 0) { -#ifdef HAVE_IPV6 - opt->family = htons(sa_family == AF_INET6 ? 2 : 1); -#else - opt->family = htons(1); -#endif len = ((opt->source_netmask - 1) >> 3) + 1; memcpy(opt->addr, addrp, len); if (opt->source_netmask & 7) opt->addr[len-1] &= 0xff << (8 - (opt->source_netmask & 7)); } - + return len + 4; } diff --git a/src/option.c b/src/option.c index 765965f..de32cad 100644 --- a/src/option.c +++ b/src/option.c @@ -1647,12 +1647,12 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma daemon->add_subnet4 = new; - new = opt_malloc(sizeof(struct mysubnet)); if (comma) { - if ((end = split_chr(comma, '/'))) - { - /* has subnet+len */ + new = opt_malloc(sizeof(struct mysubnet)); + if ((end = split_chr(comma, '/'))) + { + /* has subnet+len */ err = parse_mysockaddr(comma, &new->addr); if (err) ret_err(err); @@ -1665,8 +1665,9 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma if (!atoi_check(comma, &new->mask)) ret_err(gen_err); } - } - daemon->add_subnet6 = new; + + daemon->add_subnet6 = new; + } } break;