From d3c3fe30d6acffdc7cc59aa7bcc51952b35071ad Mon Sep 17 00:00:00 2001 From: Roy Marples Date: Fri, 7 Feb 2020 12:18:46 +0000 Subject: [PATCH] inet6: Calculate the prefix in the canonical form Rather than being clever and getting it wrong. --- src/ipv6.c | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/src/ipv6.c b/src/ipv6.c index e09c3376..c81aac86 100644 --- a/src/ipv6.c +++ b/src/ipv6.c @@ -380,25 +380,14 @@ ipv6_makeaddr(struct in6_addr *addr, struct interface *ifp, static int ipv6_makeprefix(struct in6_addr *prefix, const struct in6_addr *addr, int len) { - int bytes, bits; + struct in6_addr mask; + size_t i; - if (len < 0 || len > 128) { - errno = EINVAL; + if (ipv6_mask(&mask, len) == -1) return -1; - } - - 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); + *prefix = *addr; + for (i = 0; i < sizeof(prefix->s6_addr); i++) + prefix->s6_addr[i] &= mask.s6_addr[i]; return 0; } -- 2.47.2