dhcpv6-ia: fix onlink IA check (FS#2060)
authorHans Dedecker <dedeckeh@gmail.com>
Wed, 16 Jan 2019 10:03:14 +0000 (11:03 +0100)
committerHans Dedecker <dedeckeh@gmail.com>
Wed, 16 Jan 2019 12:34:36 +0000 (13:34 +0100)
Some DHCPv6 clients start sending SOLICIT messages without including either
an IA_NA or IA_PD and only start including an IA_NA or IA_PD in the REQUEST
message without including an IA_PREFIX or IA_ADDR as suboption. As a result
the check to verify if an IA_ADDR and/or IA_PREFIX is onlink fails.
Fix this by returning notonlink if an IA_PREFIX or IA_ADDR suboption is
present having an address/prefix not matching any of the addresses

Signed-off-by: Hans Dedecker <dedeckeh@gmail.com>
src/dhcpv6-ia.c

index fb1c22860fe571e4c8e00f3c7d3810799d4af51e..de7e673e18f569c0d6d3dca2db824324874cd102 100644 (file)
@@ -1102,7 +1102,7 @@ static bool dhcpv6_ia_on_link(const struct dhcpv6_ia_hdr *ia, struct dhcpv6_assi
        time_t now = odhcpd_time();
        uint8_t *odata, *end = ((uint8_t*)ia) + htons(ia->len) + 4;
        uint16_t otype, olen;
-       bool onlink = false;
+       bool onlink = true;
 
        dhcpv6_for_each_option((uint8_t*)&ia[1], end, otype, olen, odata) {
                struct dhcpv6_ia_prefix *p = (struct dhcpv6_ia_prefix*)&odata[-4];
@@ -1112,7 +1112,7 @@ static bool dhcpv6_ia_on_link(const struct dhcpv6_ia_hdr *ia, struct dhcpv6_assi
                                (otype != DHCPV6_OPT_IA_ADDR || olen < sizeof(*n) - 4))
                        continue;
 
-               for (size_t i = 0; i < addrlen; ++i) {
+               for (size_t i = 0, onlink = false; i < addrlen; ++i) {
                        struct in6_addr addr = addrs[i].addr.in6;
 
                        if (!valid_addr(&addrs[i], now))