X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fodhcpd.git;a=blobdiff_plain;f=src%2Fdhcpv6-ia.c;h=0bcb4530d10d41dcd112d1f502f2ff3c693bf4a8;hp=7e8e53520036ebab024101705838877c958a04df;hb=f35dce59337a8b0a0acdf362e3f8f092647c9374;hpb=33858d341fa7eff6e7245a2486fc42aee64c81ff diff --git a/src/dhcpv6-ia.c b/src/dhcpv6-ia.c index 7e8e535..0bcb453 100644 --- a/src/dhcpv6-ia.c +++ b/src/dhcpv6-ia.c @@ -60,7 +60,6 @@ void free_dhcpv6_assignment(struct dhcpv6_assignment *c) free(c->managed); free(c->hostname); - free(c->classes); free(c); } @@ -75,7 +74,7 @@ int setup_dhcpv6_ia_interface(struct interface *iface, bool enable) } } - if (iface->dhcpv6 == RELAYD_SERVER) { + if (enable && iface->dhcpv6 == RELAYD_SERVER) { if (!iface->ia_assignments.next) INIT_LIST_HEAD(&iface->ia_assignments); @@ -133,7 +132,6 @@ int setup_dhcpv6_ia_interface(struct interface *iface, bool enable) a->hostname = strdup(lease->hostname); } } else { - free(a->classes); free(a->hostname); free(a); } @@ -583,7 +581,8 @@ static void update(struct interface *iface) int minprefix = -1; for (int i = 0; i < len; ++i) { - if (addr[i].preferred > 0 && addr[i].prefix > minprefix) + if (addr[i].preferred > 0 && addr[i].prefix < 64 && + addr[i].prefix > minprefix) minprefix = addr[i].prefix; addr[i].addr.s6_addr32[3] = 0; @@ -758,7 +757,8 @@ static size_t append_reply(uint8_t *buf, size_t buflen, uint16_t status, size_t entrlen = sizeof(p) - 4; if (datalen + entrlen + 4 > buflen || - (a->assigned == 0 && a->managed_size == 0)) + (a->assigned == 0 && a->managed_size == 0) || + (!a->managed_size && a->length <= addrs[i].prefix)) continue; memcpy(buf + datalen, &p, sizeof(p));