Fix --add-subnet when returning empty or default subnet.

This commit is contained in:
Simon Kelley
2016-02-28 17:07:10 +00:00
parent 7480aeffc8
commit 22fe2fd038
2 changed files with 22 additions and 17 deletions

View File

@@ -281,8 +281,11 @@ static size_t calc_subnet_opt(struct subnet_opt *opt, union mysockaddr *source)
void *addrp; void *addrp;
int sa_family = source->sa.sa_family; int sa_family = source->sa.sa_family;
opt->source_netmask = 0;
opt->scope_netmask = 0;
#ifdef HAVE_IPV6 #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; opt->source_netmask = daemon->add_subnet6->mask;
if (daemon->add_subnet6->addr_used) if (daemon->add_subnet6->addr_used)
@@ -293,8 +296,9 @@ static size_t calc_subnet_opt(struct subnet_opt *opt, union mysockaddr *source)
else else
addrp = &source->in6.sin6_addr; addrp = &source->in6.sin6_addr;
} }
else
#endif #endif
if (source->sa.sa_family == AF_INET && daemon->add_subnet4)
{ {
opt->source_netmask = daemon->add_subnet4->mask; opt->source_netmask = daemon->add_subnet4->mask;
if (daemon->add_subnet4->addr_used) 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; sa_family = daemon->add_subnet4->addr.sa.sa_family;
addrp = get_addrp(&daemon->add_subnet4->addr, sa_family); addrp = get_addrp(&daemon->add_subnet4->addr, sa_family);
} }
else else
addrp = &source->in.sin_addr; 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; len = 0;
if (opt->source_netmask != 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; len = ((opt->source_netmask - 1) >> 3) + 1;
memcpy(opt->addr, addrp, len); memcpy(opt->addr, addrp, len);
if (opt->source_netmask & 7) if (opt->source_netmask & 7)
opt->addr[len-1] &= 0xff << (8 - (opt->source_netmask & 7)); opt->addr[len-1] &= 0xff << (8 - (opt->source_netmask & 7));
} }
return len + 4; return len + 4;
} }

View File

@@ -1647,12 +1647,12 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
daemon->add_subnet4 = new; daemon->add_subnet4 = new;
new = opt_malloc(sizeof(struct mysubnet));
if (comma) if (comma)
{ {
if ((end = split_chr(comma, '/'))) new = opt_malloc(sizeof(struct mysubnet));
{ if ((end = split_chr(comma, '/')))
/* has subnet+len */ {
/* has subnet+len */
err = parse_mysockaddr(comma, &new->addr); err = parse_mysockaddr(comma, &new->addr);
if (err) if (err)
ret_err(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)) if (!atoi_check(comma, &new->mask))
ret_err(gen_err); ret_err(gen_err);
} }
}
daemon->add_subnet6 = new; daemon->add_subnet6 = new;
}
} }
break; break;