summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorHans Dedecker <dedeckeh@gmail.com>2019-01-16 11:03:14 +0100
committerHans Dedecker <dedeckeh@gmail.com>2019-01-16 11:28:15 +0100
commit1893905f6a9b699ae0f1813670e93bf4ec3402e9 (patch)
tree111c863bfefc1ad9c2a7f64f4957ce7397515510 /src
parent7abbed4fba6c9b75ec5331291eb7dc787f99a977 (diff)
dhcpv6-ia: fix onlink IA check (FS#2060)
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>
Diffstat (limited to 'src')
-rw-r--r--src/dhcpv6-ia.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/src/dhcpv6-ia.c b/src/dhcpv6-ia.c
index 415ec2a..c72c4b4 100644
--- a/src/dhcpv6-ia.c
+++ b/src/dhcpv6-ia.c
@@ -1104,7 +1104,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];
@@ -1114,7 +1114,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))