X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fodhcpd.git;a=blobdiff_plain;f=src%2Fdhcpv6-ia.c;h=0bcb4530d10d41dcd112d1f502f2ff3c693bf4a8;hp=1476e021a590d713d4882c94bc2771e2a2f35b50;hb=f35dce59337a8b0a0acdf362e3f8f092647c9374;hpb=a06dd6481cd046e4856774ac32cdc11f4bc721e2;ds=inline diff --git a/src/dhcpv6-ia.c b/src/dhcpv6-ia.c index 1476e02..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; @@ -596,7 +595,7 @@ static void update(struct interface *iface) } struct dhcpv6_assignment *border = list_last_entry(&iface->ia_assignments, struct dhcpv6_assignment, head); - if (minprefix <= 32 || minprefix > 64) + if (minprefix > 32 && minprefix <= 64) border->assigned = 1U << (64 - minprefix); else border->assigned = 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));