From f064188032a829efdcf3988b24ac795ff52785ec Mon Sep 17 00:00:00 2001 From: Simon Kelley Date: Mon, 10 Feb 2020 21:25:12 +0000 Subject: [PATCH] Fix bug with prefixed wildcard addresses in 137286e9baecf6a3ba97722ef1b49c851b531810 --- src/rfc3315.c | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/src/rfc3315.c b/src/rfc3315.c index 2e611b3..99e168f 100644 --- a/src/rfc3315.c +++ b/src/rfc3315.c @@ -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) { - u64 addrpart; + u64 addrpart, i, addresses; struct addrlist *addr_list; if (!config || !(config->flags & CONFIG_ADDR6)) @@ -1709,32 +1709,29 @@ static int config_valid(struct dhcp_config *config, struct dhcp_context *context for (addr_list = config->addr6; addr_list; addr_list = addr_list->next) { 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 (context->prefix != 64) continue; *addr = context->start6; - setaddr6part(addr, addrpart); } else if (is_same_net6(&context->start6, &addr_list->addr.addr6, context->prefix)) *addr = addr_list->addr.addr6; else continue; - while(1) + for (i = 0 ; i < addresses; i++) { + setaddr6part(addr, addrpart+i); + if (check_address(state, addr)) 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; } }