]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
inet6: Calculate the prefix in the canonical form
authorRoy Marples <roy@marples.name>
Fri, 7 Feb 2020 12:18:46 +0000 (12:18 +0000)
committerRoy Marples <roy@marples.name>
Fri, 7 Feb 2020 12:18:46 +0000 (12:18 +0000)
Rather than being clever and getting it wrong.

src/ipv6.c

index cfeeda0bdfbd9df345eb5d00081fd413106dc7b0..18f32c6c729fe08c96557c6f64b7c929a79f0d44 100644 (file)
@@ -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;
 }