[master] 75d56fe13 The vtester running in a IPv6 enabled jail, attempting u000000 says:

Poul-Henning Kamp phk at FreeBSD.org
Fri Jan 8 20:19:12 UTC 2021


commit 75d56fe136c2bf39471e40c921b090d33346bb1a
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Fri Jan 8 20:16:36 2021 +0000

    The vtester running in a IPv6 enabled jail, attempting u000000 says:
    
            Connection failed (fec0:: 19925): (null)
    
    The's not an IPv6 address.
    
    *This* is an IPv6 address:
    
            fec0::205

diff --git a/lib/libvarnish/vsa.c b/lib/libvarnish/vsa.c
index 921ff0f04..85a3e6785 100644
--- a/lib/libvarnish/vsa.c
+++ b/lib/libvarnish/vsa.c
@@ -172,7 +172,7 @@ struct suckaddr {
 		struct sockaddr		sa;
 		struct sockaddr_in	sa4;
 		struct sockaddr_in6	sa6;
-	};
+	} u;
 };
 
 const size_t vsa_suckaddr_len = sizeof(struct suckaddr);
@@ -204,15 +204,15 @@ VSA_GetPtr(const struct suckaddr *sua, const unsigned char ** dst)
 		return (-1);
 	CHECK_OBJ_NOTNULL(sua, SUCKADDR_MAGIC);
 
-	switch (sua->sa.sa_family) {
+	switch (sua->u.sa.sa_family) {
 	case PF_INET:
-		assert(sua->sa.sa_family == sua->sa4.sin_family);
-		*dst = (const unsigned char *)&sua->sa4.sin_addr;
-		return (sua->sa4.sin_family);
+		assert(sua->u.sa.sa_family == sua->u.sa4.sin_family);
+		*dst = (const unsigned char *)&sua->u.sa4.sin_addr;
+		return (sua->u.sa4.sin_family);
 	case PF_INET6:
-		assert(sua->sa.sa_family == sua->sa6.sin6_family);
-		*dst = (const unsigned char *)&sua->sa6.sin6_addr;
-		return (sua->sa6.sin6_family);
+		assert(sua->u.sa.sa_family == sua->u.sa6.sin6_family);
+		*dst = (const unsigned char *)&sua->u.sa6.sin6_addr;
+		return (sua->u.sa6.sin6_family);
 	default:
 		*dst = NULL;
 		return (-1);
@@ -317,17 +317,17 @@ VSA_Build(void *d, const void *s, unsigned sal)
 
 	INIT_OBJ(sua, SUCKADDR_MAGIC);
 	switch (l) {
-	case sizeof sua->sa4:
-		memcpy(&sua->sa4, s, l);
+	case sizeof sua->u.sa4:
+		memcpy(&sua->u.sa4, s, l);
 		break;
-	case sizeof sua->sa6:
-		memcpy(&sua->sa6, s, l);
+	case sizeof sua->u.sa6:
+		memcpy(&sua->u.sa6, s, l);
 		break;
 	default:
 		WRONG("VSA protocol vs. size");
 	}
 #ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
-	sua->sa.sa_len = (unsigned char)l;
+	sua->u.sa.sa_len = (unsigned char)l;
 #endif
 	return (sua);
 }
@@ -339,11 +339,11 @@ VSA_Get_Sockaddr(const struct suckaddr *sua, socklen_t *slp)
 
 	CHECK_OBJ_NOTNULL(sua, SUCKADDR_MAGIC);
 	AN(slp);
-	sl = sua_len(&sua->sa);
+	sl = sua_len(&sua->u.sa);
 	if (sl == 0)
 		return (NULL);
 	*slp = sl;
-	return (&sua->sa);
+	return (&sua->u.sa);
 }
 
 int
@@ -351,13 +351,13 @@ VSA_Get_Proto(const struct suckaddr *sua)
 {
 
 	CHECK_OBJ_NOTNULL(sua, SUCKADDR_MAGIC);
-	return (sua->sa.sa_family);
+	return (sua->u.sa.sa_family);
 }
 
 int
 VSA_Sane(const struct suckaddr *sua)
 {
-	return (VALID_OBJ(sua, SUCKADDR_MAGIC) && sua_len(&sua->sa) != 0);
+	return (VALID_OBJ(sua, SUCKADDR_MAGIC) && sua_len(&sua->u.sa) != 0);
 }
 
 int
@@ -376,16 +376,16 @@ VSA_Compare_IP(const struct suckaddr *sua1, const struct suckaddr *sua2)
 	assert(VSA_Sane(sua1));
 	assert(VSA_Sane(sua2));
 
-	if (sua1->sa.sa_family != sua2->sa.sa_family)
+	if (sua1->u.sa.sa_family != sua2->u.sa.sa_family)
 		return (-1);
 
-	switch (sua1->sa.sa_family) {
+	switch (sua1->u.sa.sa_family) {
 	case PF_INET:
-		return (memcmp(&sua1->sa4.sin_addr,
-		    &sua2->sa4.sin_addr, sizeof(struct in_addr)));
+		return (memcmp(&sua1->u.sa4.sin_addr,
+		    &sua2->u.sa4.sin_addr, sizeof(struct in_addr)));
 	case PF_INET6:
-		return (memcmp(&sua1->sa6.sin6_addr,
-		    &sua2->sa6.sin6_addr, sizeof(struct in6_addr)));
+		return (memcmp(&sua1->u.sa6.sin6_addr,
+		    &sua2->u.sa6.sin6_addr, sizeof(struct in6_addr)));
 	default:
 		WRONG("Just plain insane");
 	}
@@ -409,11 +409,11 @@ VSA_Port(const struct suckaddr *sua)
 {
 
 	CHECK_OBJ_NOTNULL(sua, SUCKADDR_MAGIC);
-	switch (sua->sa.sa_family) {
+	switch (sua->u.sa.sa_family) {
 	case PF_INET:
-		return (ntohs(sua->sa4.sin_port));
+		return (ntohs(sua->u.sa4.sin_port));
 	case PF_INET6:
-		return (ntohs(sua->sa6.sin6_port));
+		return (ntohs(sua->u.sa6.sin6_port));
 	default:
 		return (0);
 	}
@@ -436,8 +436,8 @@ VSA_get ## which ## name(int fd, void *d, size_t l)	\
 	sua = d;					\
 							\
 	INIT_OBJ(sua, SUCKADDR_MAGIC);			\
-	sl = sizeof(sua->sa);				\
-	r = get ## which ## name(fd, &sua->sa, &sl);	\
+	sl = sizeof(sua->u);				\
+	r = get ## which ## name(fd, &sua->u.sa, &sl);	\
 							\
 	return (r == 0 ? sua : NULL);			\
 }							\


More information about the varnish-commit mailing list