Fix bug with prefixed wildcard addresses in 137286e9ba

This commit is contained in:
Simon Kelley
2020-02-10 21:25:12 +00:00
parent 77476580ed
commit f064188032

View File

@@ -1700,7 +1700,7 @@ static int config_implies(struct dhcp_config *config, struct dhcp_context *conte
static int config_valid(struct dhcp_config *config, struct dhcp_context *context, struct in6_addr *addr, struct state *state) static int config_valid(struct dhcp_config *config, struct dhcp_context *context, struct in6_addr *addr, struct state *state)
{ {
u64 addrpart; u64 addrpart, i, addresses;
struct addrlist *addr_list; struct addrlist *addr_list;
if (!config || !(config->flags & CONFIG_ADDR6)) if (!config || !(config->flags & CONFIG_ADDR6))
@@ -1709,6 +1709,10 @@ static int config_valid(struct dhcp_config *config, struct dhcp_context *context
for (addr_list = config->addr6; addr_list; addr_list = addr_list->next) for (addr_list = config->addr6; addr_list; addr_list = addr_list->next)
{ {
addrpart = addr6part(&addr_list->addr.addr6); addrpart = addr6part(&addr_list->addr.addr6);
addresses = 1;
if (addr_list->flags & ADDRLIST_PREFIX)
addresses = 1<<(128-addr_list->prefixlen);
if ((addr_list->flags & ADDRLIST_WILDCARD)) if ((addr_list->flags & ADDRLIST_WILDCARD))
{ {
@@ -1716,25 +1720,18 @@ static int config_valid(struct dhcp_config *config, struct dhcp_context *context
continue; continue;
*addr = context->start6; *addr = context->start6;
setaddr6part(addr, addrpart);
} }
else if (is_same_net6(&context->start6, &addr_list->addr.addr6, context->prefix)) else if (is_same_net6(&context->start6, &addr_list->addr.addr6, context->prefix))
*addr = addr_list->addr.addr6; *addr = addr_list->addr.addr6;
else else
continue; continue;
while(1) for (i = 0 ; i < addresses; i++)
{ {
setaddr6part(addr, addrpart+i);
if (check_address(state, addr)) if (check_address(state, addr))
return 1; return 1;
if (!(addr_list->flags & ADDRLIST_PREFIX))
break;
addrpart++;
setaddr6part(addr, addrpart);
if (!is_same_net6(addr, &addr_list->addr.addr6, addr_list->prefixlen))
break;
} }
} }