changeset 5225:2b18af138e24 draft

privsep: sockaddr len should be socklen_t While ps_root_getifaddrs is only for capsicum, it's highly portable and thus in the privsep-root rather than privsep-bsd. As such, store the sockaddr len as socklen_t because that's what POSIX demands. It's only a few more bytes and I'd rather make this change now than it potentially bite me later.
author Roy Marples <roy@marples.name>
date Thu, 14 May 2020 01:15:39 +0100
parents a71e4a05aa61
children 06575a46bbdd
files src/privsep-root.c
diffstat 1 files changed, 24 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/src/privsep-root.c	Wed May 13 20:58:58 2020 +0100
+++ b/src/privsep-root.c	Thu May 14 01:15:39 2020 +0100
@@ -302,6 +302,7 @@
 	struct ifaddrs *ifaddrs, *ifa;
 	size_t len;
 	uint8_t *buf, *sap;
+	socklen_t salen;
 	void *ifdata;
 
 	if (getifaddrs(&ifaddrs) == -1)
@@ -321,7 +322,7 @@
 	for (ifa = ifaddrs; ifa != NULL; ifa = ifa->ifa_next) {
 		len += ALIGN(sizeof(*ifa));
 		len += ALIGN(IFNAMSIZ);
-		len += ALIGN(sizeof(*sap) * IFA_NADDRS);
+		len += ALIGN(sizeof(salen) * IFA_NADDRS);
 		if (ifa->ifa_addr != NULL)
 			len += ALIGN(sa_len(ifa->ifa_addr));
 		if (ifa->ifa_netmask != NULL)
@@ -352,16 +353,17 @@
 		strlcpy((char *)buf, ifa->ifa_name, IFNAMSIZ);
 		buf += ALIGN(IFNAMSIZ);
 		sap = buf;
-		buf += ALIGN(sizeof(*sap) * IFA_NADDRS);
+		buf += ALIGN(sizeof(salen) * IFA_NADDRS);
 
-#define	COPYINSA(addr)					\
-	do {						\
-		*sap = sa_len((addr));			\
-		if (*sap != 0) {			\
-			memcpy(buf, (addr), *sap);	\
-			buf += ALIGN(*sap);		\
-		}					\
-		sap++;					\
+#define	COPYINSA(addr)						\
+	do {							\
+		salen = sa_len((addr));				\
+		if (salen != 0) {				\
+			memcpy(sap, &salen, sizeof(salen));	\
+			memcpy(buf, (addr), salen);		\
+			buf += ALIGN(salen);			\
+		}						\
+		sap += sizeof(salen);				\
 	} while (0 /*CONSTCOND */)
 
 		if (ifa->ifa_addr != NULL)
@@ -718,8 +720,8 @@
 {
 	struct ifaddrs *ifa;
 	void *buf = NULL;
-	char *bp;
-	unsigned char *sap;
+	char *bp, *sap;
+	socklen_t salen;
 	size_t len;
 	ssize_t err;
 
@@ -741,26 +743,27 @@
 	*ifahead = (struct ifaddrs *)(void *)bp;
 	for (ifa = *ifahead; len != 0; ifa = ifa->ifa_next) {
 		if (len < ALIGN(sizeof(*ifa)) +
-		    ALIGN(IFNAMSIZ) + ALIGN(sizeof(*sap) * IFA_NADDRS))
+		    ALIGN(IFNAMSIZ) + ALIGN(sizeof(salen) * IFA_NADDRS))
 			goto err;
 		bp += ALIGN(sizeof(*ifa));
 		ifa->ifa_name = bp;
 		bp += ALIGN(IFNAMSIZ);
-		sap = (unsigned char *)bp;
-		bp += ALIGN(sizeof(*sap) * IFA_NADDRS);
+		sap = bp;
+		bp += ALIGN(sizeof(salen) * IFA_NADDRS);
 		len -= ALIGN(sizeof(*ifa)) +
-		    ALIGN(IFNAMSIZ) + ALIGN(sizeof(*sap) * IFA_NADDRS);
+		    ALIGN(IFNAMSIZ) + ALIGN(sizeof(salen) * IFA_NADDRS);
 
 #define	COPYOUTSA(addr)						\
 	do {							\
-		if (len < *sap)					\
+		memcpy(&salen, sap, sizeof(salen));		\
+		if (len < salen)				\
 			goto err;				\
-		if (*sap != 0) {				\
+		if (salen != 0) {				\
 			(addr) = (struct sockaddr *)bp;		\
-			bp += ALIGN(*sap);			\
-			len -= ALIGN(*sap);			\
+			bp += ALIGN(salen);			\
+			len -= ALIGN(salen);			\
 		}						\
-		sap++;						\
+		sap += sizeof(salen);				\
 	} while (0 /* CONSTCOND */)
 
 		COPYOUTSA(ifa->ifa_addr);