Mercurial > hg > dhcpcd
changeset 5048:1d342610ff74 draft
inet6: Calculate the prefix in the canonical form
Rather than being clever and getting it wrong.
| author | Roy Marples <roy@marples.name> |
|---|---|
| date | Fri, 07 Feb 2020 12:18:46 +0000 |
| parents | 91d05626f72d |
| children | fb4b6e3ab45e |
| files | src/ipv6.c |
| diffstat | 1 files changed, 7 insertions(+), 18 deletions(-) [+] |
line wrap: on
line diff
--- a/src/ipv6.c Thu Feb 06 15:08:21 2020 +0000 +++ b/src/ipv6.c Fri Feb 07 12:18:46 2020 +0000 @@ -380,25 +380,14 @@ static int ipv6_makeprefix(struct in6_addr *prefix, const struct in6_addr *addr, int len) { - int bytes, bits; - - if (len < 0 || len > 128) { - errno = EINVAL; - return -1; - } + struct in6_addr mask; + size_t i; - bytes = len / NBBY; - bits = len % NBBY; - memcpy(&prefix->s6_addr, &addr->s6_addr, (size_t)bytes); - if (bits != 0) { - /* Coverify false positive. - * bytelen cannot be 16 if bitlen is non zero */ - /* coverity[overrun-local] */ - prefix->s6_addr[bytes] = - (uint8_t)(prefix->s6_addr[bytes] >> (NBBY - bits)); - } - memset((char *)prefix->s6_addr + bytes, 0, - sizeof(prefix->s6_addr) - (size_t)bytes); + if (ipv6_mask(&mask, len) == -1) + return -1; + *prefix = *addr; + for (i = 0; i < sizeof(prefix->s6_addr); i++) + prefix->s6_addr[i] &= mask.s6_addr[i]; return 0; }
