changeset 5047:fa819e51fccc 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 26e3e59cb85d
children aa936fa9275e
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;
 }