[master] c1352b0b0 Use VSA_getsockname() - avoid sockaddr_storage

Nils Goroll nils.goroll at uplex.de
Fri Jan 8 16:54:08 UTC 2021


commit c1352b0b0ece8028317c838751d9042a55347cd5
Author: Nils Goroll <nils.goroll at uplex.de>
Date:   Fri Jan 8 16:17:52 2021 +0100

    Use VSA_getsockname() - avoid sockaddr_storage
    
    avoids an second getsockname() in vbp_write_proxy_v1()
    avoids a memcpy() in VTCP_my_suckaddr()

diff --git a/bin/varnishd/cache/cache_backend_probe.c b/bin/varnishd/cache/cache_backend_probe.c
index ee9e0dbf2..d638a9f8e 100644
--- a/bin/varnishd/cache/cache_backend_probe.c
+++ b/bin/varnishd/cache/cache_backend_probe.c
@@ -251,20 +251,22 @@ vbp_write_proxy_v1(struct vbp_target *vt, int *sock)
 	char buf[105]; /* maximum size for a TCP6 PROXY line with null char */
 	char addr[VTCP_ADDRBUFSIZE];
 	char port[VTCP_PORTBUFSIZE];
-	struct sockaddr_storage ss;
+	char vsabuf[vsa_suckaddr_len];
+	struct suckaddr *sua;
+	int proto;
 	struct vsb vsb;
-	socklen_t l;
 
-	VTCP_myname(*sock, addr, sizeof addr, port, sizeof port);
+	sua = VSA_getsockname(*sock, vsabuf, sizeof vsabuf);
+	AN(sua);
+	VTCP_name(sua, addr, sizeof addr, port, sizeof port);
 	AN(VSB_init(&vsb, buf, sizeof buf));
 
-	l = sizeof ss;
-	AZ(getsockname(*sock, (void *)&ss, &l));
-	if (ss.ss_family == AF_INET || ss.ss_family == AF_INET6) {
+	proto = VSA_Get_Proto(sua);
+	if (proto == AF_INET || proto == AF_INET6)
 		VSB_printf(&vsb, "PROXY %s %s %s %s %s\r\n",
-		    ss.ss_family == AF_INET ? "TCP4" : "TCP6",
+		    proto == AF_INET ? "TCP4" : "TCP6",
 		    addr, addr, port, port);
-	} else
+	else
 		VSB_cat(&vsb, "PROXY UNKNOWN\r\n");
 	AZ(VSB_finish(&vsb));
 
diff --git a/lib/libvarnish/vtcp.c b/lib/libvarnish/vtcp.c
index 90857c329..61b580e67 100644
--- a/lib/libvarnish/vtcp.c
+++ b/lib/libvarnish/vtcp.c
@@ -48,6 +48,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <unistd.h>
+#include <stdlib.h>
 
 #include "vdef.h"
 #include "vas.h"
@@ -105,12 +106,8 @@ VTCP_name(const struct suckaddr *addr, char *abuf, unsigned alen,
 struct suckaddr *
 VTCP_my_suckaddr(int sock)
 {
-	struct sockaddr_storage addr_s;
-	socklen_t l;
-
-	l = sizeof addr_s;
-	AZ(getsockname(sock, (void *)&addr_s, &l));
-	return (VSA_Malloc(&addr_s, l));
+	return (VSA_getsockname(sock,
+	    malloc(vsa_suckaddr_len), vsa_suckaddr_len));
 }
 
 /*--------------------------------------------------------------------*/
@@ -118,12 +115,10 @@ VTCP_my_suckaddr(int sock)
 void
 VTCP_myname(int sock, char *abuf, unsigned alen, char *pbuf, unsigned plen)
 {
-	struct sockaddr_storage addr_s;
-	socklen_t l;
+	char buf[vsa_suckaddr_len];
 
-	l = sizeof addr_s;
-	AZ(getsockname(sock, (void *)&addr_s, &l));
-	vtcp_sa_to_ascii(&addr_s, l, abuf, alen, pbuf, plen);
+	VTCP_name(VSA_getsockname(sock, buf, sizeof buf),
+		  abuf, alen, pbuf, plen);
 }
 
 /*--------------------------------------------------------------------*/


More information about the varnish-commit mailing list