diff options
author | Steven Barth <steven@midlink.org> | 2013-12-04 12:23:20 +0100 |
---|---|---|
committer | Steven Barth <steven@midlink.org> | 2013-12-04 12:23:20 +0100 |
commit | 8c623209b062015f98b0b35f3e7aae3de1e87715 (patch) | |
tree | 8d546825f16b15181e79abc4572f09041186d6cf | |
parent | 1565d76bd6ff2d1064c3d30e947dc70613417853 (diff) |
Fix prefix class IA_NA / IA_PD encoding
-rw-r--r-- | src/dhcpv6-ia.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/src/dhcpv6-ia.c b/src/dhcpv6-ia.c index b0a31a2..a990001 100644 --- a/src/dhcpv6-ia.c +++ b/src/dhcpv6-ia.c @@ -600,7 +600,7 @@ static size_t append_reply(uint8_t *buf, size_t buflen, uint16_t status, .addr = iface->ia_addr[i].addr }; p.addr.s6_addr32[1] |= htonl(a->assigned); - size_t entrlen = sizeof(p); + size_t entrlen = sizeof(p) - 4; #ifdef DHCPV6_OPT_PREFIX_CLASS if (iface->ia_addr[i].has_class) { @@ -609,14 +609,14 @@ static size_t append_reply(uint8_t *buf, size_t buflen, uint16_t status, } #endif - if (datalen + entrlen > buflen || a->assigned == 0) + if (datalen + entrlen + 4 > buflen || a->assigned == 0) continue; memcpy(buf + datalen, &p, sizeof(p)); #ifdef DHCPV6_OPT_PREFIX_CLASS memcpy(buf + datalen + sizeof(p), &pclass, sizeof(pclass)); #endif - datalen += entrlen; + datalen += entrlen + 4; } else { struct dhcpv6_ia_addr n = { .type = htons(DHCPV6_OPT_IA_ADDR), @@ -626,7 +626,7 @@ static size_t append_reply(uint8_t *buf, size_t buflen, uint16_t status, .valid = htonl(prefix_valid) }; n.addr.s6_addr32[3] = htonl(a->assigned); - size_t entrlen = sizeof(n); + size_t entrlen = sizeof(n) - 4; #ifdef DHCPV6_OPT_PREFIX_CLASS if (iface->ia_addr[i].has_class) { @@ -635,14 +635,14 @@ static size_t append_reply(uint8_t *buf, size_t buflen, uint16_t status, } #endif - if (datalen + entrlen > buflen || a->assigned == 0) + if (datalen + entrlen + 4 > buflen || a->assigned == 0) continue; memcpy(buf + datalen, &n, sizeof(n)); #ifdef DHCPV6_OPT_PREFIX_CLASS memcpy(buf + datalen + sizeof(n), &pclass, sizeof(pclass)); #endif - datalen += entrlen; + datalen += entrlen + 4; } // Calculate T1 / T2 based on non-deprecated addresses |