[master] 2948843f1 Introduce VSA_free() and constify suckaddrs

Poul-Henning Kamp phk at FreeBSD.org
Wed Nov 30 21:00:16 UTC 2022


commit 2948843f182ffe1feb27ae8e82bf997775d16020
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Wed Nov 30 20:59:23 2022 +0000

    Introduce VSA_free() and constify suckaddrs
    
    Inspired by: CHERI

diff --git a/bin/varnishd/cache/cache_backend_probe.c b/bin/varnishd/cache/cache_backend_probe.c
index 594dc7627..d38a51b72 100644
--- a/bin/varnishd/cache/cache_backend_probe.c
+++ b/bin/varnishd/cache/cache_backend_probe.c
@@ -247,7 +247,7 @@ vbp_write_proxy_v1(struct vbp_target *vt, int *sock)
 	char addr[VTCP_ADDRBUFSIZE];
 	char port[VTCP_PORTBUFSIZE];
 	char vsabuf[vsa_suckaddr_len];
-	struct suckaddr *sua;
+	const struct suckaddr *sua;
 	int proto;
 	struct vsb vsb;
 
diff --git a/bin/varnishd/common/heritage.h b/bin/varnishd/common/heritage.h
index 06dbe177d..5b68d96a3 100644
--- a/bin/varnishd/common/heritage.h
+++ b/bin/varnishd/common/heritage.h
@@ -48,7 +48,7 @@ struct listen_sock {
 	int				uds;
 	char				*endpoint;
 	const char			*name;
-	struct suckaddr			*addr;
+	const struct suckaddr		*addr;
 	const struct transport		*transport;
 	const struct uds_perms		*perms;
 	unsigned			test_heritage;
diff --git a/bin/varnishd/mgt/mgt_acceptor.c b/bin/varnishd/mgt/mgt_acceptor.c
index 9b649a7b9..06946389d 100644
--- a/bin/varnishd/mgt/mgt_acceptor.c
+++ b/bin/varnishd/mgt/mgt_acceptor.c
@@ -163,7 +163,7 @@ mk_listen_sock(const struct listen_arg *la, const struct suckaddr *sa)
 	fail = mac_opensocket(ls);
 	VJ_master(JAIL_MASTER_LOW);
 	if (fail) {
-		free(ls->addr);
+		VSA_free(&ls->addr);
 		free(ls->endpoint);
 		FREE_OBJ(ls);
 		if (fail != EAFNOSUPPORT)
@@ -199,7 +199,7 @@ mac_tcp(void *priv, const struct suckaddr *sa)
 		 * port number this VTCP_bind() found us, as if
 		 * it was specified by the argv.
 		 */
-		free(ls->addr);
+		VSA_free(&ls->addr);
 		ls->addr = VTCP_my_suckaddr(ls->sock);
 		VTCP_myname(ls->sock, abuf, sizeof abuf,
 		    pbuf, sizeof pbuf);
diff --git a/bin/varnishd/mgt/mgt_cli.c b/bin/varnishd/mgt/mgt_cli.c
index 5692335a5..4a21962e9 100644
--- a/bin/varnishd/mgt/mgt_cli.c
+++ b/bin/varnishd/mgt/mgt_cli.c
@@ -552,7 +552,7 @@ mgt_cli_telnet(const char *T_arg)
 struct m_addr {
 	unsigned		magic;
 #define M_ADDR_MAGIC		0xbc6217ed
-	struct suckaddr		*sa;
+	const struct suckaddr	*sa;
 	VTAILQ_ENTRY(m_addr)	list;
 };
 
diff --git a/bin/varnishtest/vtc_barrier.c b/bin/varnishtest/vtc_barrier.c
index 9b1f6a026..04f5db027 100644
--- a/bin/varnishtest/vtc_barrier.c
+++ b/bin/varnishtest/vtc_barrier.c
@@ -133,7 +133,7 @@ barrier_sock_thread(void *priv)
 	struct vtclog *vl;
 	const char *err;
 	char buf[vsa_suckaddr_len];
-	struct suckaddr *sua;
+	const struct suckaddr *sua;
 
 	char abuf[VTCP_ADDRBUFSIZE], pbuf[VTCP_PORTBUFSIZE];
 	int i, sock, *conns;
diff --git a/bin/varnishtest/vtc_client.c b/bin/varnishtest/vtc_client.c
index 883aad017..fb7277d5c 100644
--- a/bin/varnishtest/vtc_client.c
+++ b/bin/varnishtest/vtc_client.c
@@ -42,6 +42,7 @@
 
 #include "vtc.h"
 
+#include "vsa.h"
 #include "vss.h"
 #include "vtcp.h"
 #include "vus.h"
@@ -75,7 +76,7 @@ static VTAILQ_HEAD(, client)	clients = VTAILQ_HEAD_INITIALIZER(clients);
 static void
 client_proxy(struct vtclog *vl, int fd, int version, const char *spec)
 {
-	struct suckaddr *sac, *sas;
+	const struct suckaddr *sac, *sas;
 	char *p, *p2;
 
 	p = strdup(spec);
@@ -93,8 +94,8 @@ client_proxy(struct vtclog *vl, int fd, int version, const char *spec)
 	if (vtc_send_proxy(fd, version, sac, sas))
 		vtc_fatal(vl, "Write failed: %s", strerror(errno));
 	free(p);
-	free(sac);
-	free(sas);
+	VSA_free(&sac);
+	VSA_free(&sas);
 }
 
 /**********************************************************************
diff --git a/bin/varnishtest/vtc_haproxy.c b/bin/varnishtest/vtc_haproxy.c
index 7f0e11601..cf71a812e 100644
--- a/bin/varnishtest/vtc_haproxy.c
+++ b/bin/varnishtest/vtc_haproxy.c
@@ -527,7 +527,7 @@ haproxy_create_mcli(struct haproxy *h)
 	const char *err;
 	char buf[128], addr[128], port[128];
 	char vsabuf[vsa_suckaddr_len];
-	struct suckaddr *sua;
+	const struct suckaddr *sua;
 
 	sock = VTCP_listen_on(default_listen_addr, NULL, 100, &err);
 	if (err != NULL)
@@ -574,7 +574,7 @@ haproxy_new(const char *name)
 	const char *err;
 	const char *env_args;
 	char vsabuf[vsa_suckaddr_len];
-	struct suckaddr *sua;
+	const struct suckaddr *sua;
 
 	ALLOC_OBJ(h, HAPROXY_MAGIC);
 	AN(h);
@@ -864,7 +864,7 @@ haproxy_build_backends(struct haproxy *h, const char *vsb_data)
 		char buf[128], addr[128], port[128];
 		const char *err;
 		char vsabuf[vsa_suckaddr_len];
-		struct suckaddr *sua;
+		const struct suckaddr *sua;
 
 		p = strstr(p, HAPROXY_BE_FD_STR);
 		if (!p)
diff --git a/bin/varnishtest/vtc_main.c b/bin/varnishtest/vtc_main.c
index d020b37ec..c61fecc8d 100644
--- a/bin/varnishtest/vtc_main.c
+++ b/bin/varnishtest/vtc_main.c
@@ -49,8 +49,8 @@
 #include "vfil.h"
 #include "vnum.h"
 #include "vrnd.h"
-#include "vss.h"
 #include "vsa.h"
+#include "vss.h"
 #include "vsub.h"
 #include "vtcp.h"
 #include "vtim.h"
@@ -605,7 +605,7 @@ i_mode(void)
 static void
 ip_magic(void)
 {
-	struct suckaddr *sa;
+	const struct suckaddr *sa;
 	char abuf[VTCP_ADDRBUFSIZE];
 	char pbuf[VTCP_PORTBUFSIZE];
 	char *s;
@@ -621,7 +621,7 @@ ip_magic(void)
 	AN(sa);
 	bad_backend_fd = VTCP_bind(sa, NULL);
 	if (bad_backend_fd < 0) {
-		free(sa);
+		VSA_free(&sa);
 		sa = VSS_ResolveFirst(NULL, "localhost", "0", 0, SOCK_STREAM, 0);
 		AN(sa);
 		bad_backend_fd = VTCP_bind(sa, NULL);
@@ -657,7 +657,7 @@ ip_magic(void)
 	extmacro_def("listen_addr", NULL, "%s", abuf);
 	default_listen_addr = strdup(abuf);
 	AN(default_listen_addr);
-	free(sa);
+	VSA_free(&sa);
 
 	/*
 	 * We need an IP number which will not repond, ever, and that is a
diff --git a/bin/varnishtest/vtc_misc.c b/bin/varnishtest/vtc_misc.c
index 78ec28464..30784d61a 100644
--- a/bin/varnishtest/vtc_misc.c
+++ b/bin/varnishtest/vtc_misc.c
@@ -51,6 +51,7 @@
 #include "vnum.h"
 #include "vre.h"
 #include "vtcp.h"
+#include "vsa.h"
 #include "vss.h"
 #include "vtim.h"
 #include "vus.h"
@@ -356,7 +357,7 @@ cmd_delay(CMD_ARGS)
 static int
 dns_works(void)
 {
-	struct suckaddr *sa;
+	const struct suckaddr *sa;
 	char abuf[VTCP_ADDRBUFSIZE];
 	char pbuf[VTCP_PORTBUFSIZE];
 
@@ -365,7 +366,7 @@ dns_works(void)
 	if (sa == NULL)
 		return (0);
 	VTCP_name(sa, abuf, sizeof abuf, pbuf, sizeof pbuf);
-	free(sa);
+	VSA_free(&sa);
 	if (strcmp(abuf, "192.0.2.255"))
 		return (0);
 
@@ -373,7 +374,7 @@ dns_works(void)
 	    AF_INET6, SOCK_STREAM, 0);
 	if (sa == NULL)
 		return (1); /* the canary is ipv4 only */
-	free(sa);
+	VSA_free(&sa);
 	return (0);
 }
 
@@ -384,14 +385,14 @@ dns_works(void)
 static int
 ipvx_works(const char *target)
 {
-	struct suckaddr *sa;
+	const struct suckaddr *sa;
 	int fd;
 
 	sa = VSS_ResolveOne(NULL, target, "0", 0, SOCK_STREAM, 0);
 	if (sa == NULL)
 		return (0);
 	fd = VTCP_bind(sa, NULL);
-	free(sa);
+	VSA_free(&sa);
 	if (fd >= 0) {
 		VTCP_close(&fd);
 		return (1);
diff --git a/bin/varnishtest/vtc_server.c b/bin/varnishtest/vtc_server.c
index f09131a24..3942ae92d 100644
--- a/bin/varnishtest/vtc_server.c
+++ b/bin/varnishtest/vtc_server.c
@@ -185,7 +185,7 @@ static void
 server_listen_tcp(struct server *s, const char **errp)
 {
 	char buf[vsa_suckaddr_len];
-	struct suckaddr *sua;
+	const struct suckaddr *sua;
 
 	s->sock = VTCP_listen_on(s->listen, "0", s->depth, errp);
 	if (*errp != NULL)
diff --git a/bin/varnishtest/vtc_syslog.c b/bin/varnishtest/vtc_syslog.c
index ac988e9af..7dc97db7d 100644
--- a/bin/varnishtest/vtc_syslog.c
+++ b/bin/varnishtest/vtc_syslog.c
@@ -359,7 +359,7 @@ syslog_bind(struct syslog_srv *s)
 	char aaddr[VTCP_ADDRBUFSIZE];
 	char aport[VTCP_PORTBUFSIZE];
 	char buf[vsa_suckaddr_len];
-	struct suckaddr *sua;
+	const struct suckaddr *sua;
 
 	CHECK_OBJ_NOTNULL(s, SYSLOG_SRV_MAGIC);
 
diff --git a/bin/varnishtest/vtc_tunnel.c b/bin/varnishtest/vtc_tunnel.c
index 342617c2b..3899cc536 100644
--- a/bin/varnishtest/vtc_tunnel.c
+++ b/bin/varnishtest/vtc_tunnel.c
@@ -583,7 +583,7 @@ static void
 tunnel_listen(struct tunnel *t)
 {
 	char buf[vsa_suckaddr_len];
-	struct suckaddr *sua;
+	const struct suckaddr *sua;
 	const char *err;
 
 	if (t->lsock >= 0)
diff --git a/flint.lnt b/flint.lnt
index 3724d99f1..af5a93da6 100644
--- a/flint.lnt
+++ b/flint.lnt
@@ -9,6 +9,9 @@
 //d__flexelint_v9__=1
 +fan
 
+// No automatic custody
+-ffc
+
 -hm4
 
 ///////////////////////////////////////////////////////////////////////
diff --git a/include/vsa.h b/include/vsa.h
index 7b7ffb55e..b542b2329 100644
--- a/include/vsa.h
+++ b/include/vsa.h
@@ -42,9 +42,10 @@ int VSA_Sane(const struct suckaddr *);
 unsigned VSA_Port(const struct suckaddr *);
 int VSA_Compare(const struct suckaddr *, const struct suckaddr *);
 int VSA_Compare_IP(const struct suckaddr *, const struct suckaddr *);
-struct suckaddr *VSA_Clone(const struct suckaddr *sua);
-struct suckaddr *VSA_getsockname(int, void *, size_t);
-struct suckaddr *VSA_getpeername(int, void *, size_t);
+const struct suckaddr *VSA_Clone(const struct suckaddr *sua);
+const struct suckaddr *VSA_getsockname(int, void *, size_t);
+const struct suckaddr *VSA_getpeername(int, void *, size_t);
+void VSA_free(const struct suckaddr **);
 
 const void *VSA_Get_Sockaddr(const struct suckaddr *, socklen_t *sl);
 int VSA_Get_Proto(const struct suckaddr *);
@@ -52,13 +53,14 @@ int VSA_Get_Proto(const struct suckaddr *);
 /*
  * 's' is a sockaddr of some kind, 'sal' is its length
  */
-struct suckaddr *VSA_Malloc(const void *s, unsigned  sal);
+const struct suckaddr *VSA_Malloc(const void *s, unsigned  sal);
 
 /*
- * 'd' SHALL point to vsa_suckaddr_len aligned bytes of storage,
+ * 'd' can point to vsa_suckaddr_len aligned bytes of storage, but
+ *     if it is NULL, malloc will be called.
  * 's' is a sockaddr of some kind, 'sal' is its length.
  */
-struct suckaddr *VSA_Build(void *d, const void *s, unsigned sal);
+const struct suckaddr *VSA_Build(void *d, const void *s, unsigned sal);
 
 /* 'd' SHALL point to vsa_suckaddr_len aligned bytes of storage
  *
@@ -69,7 +71,7 @@ struct suckaddr *VSA_Build(void *d, const void *s, unsigned sal);
  * NULL or 0 length argument are ignored.
  * argument of the wrong length are an error (NULL return value, EINVAL)
  */
-struct suckaddr * VSA_BuildFAP(void *d, sa_family_t fam,
+const struct suckaddr * VSA_BuildFAP(void *d, sa_family_t fam,
     const void *a, unsigned al, const void *p, unsigned pl);
 
 /*
diff --git a/include/vss.h b/include/vss.h
index 4695743b2..5db0bb7e6 100644
--- a/include/vss.h
+++ b/include/vss.h
@@ -36,9 +36,9 @@ int VSS_resolver(const char *addr, const char *def_port, vss_resolved_f *func,
    void *priv, const char **err);
 int VSS_resolver_socktype(const char *addr, const char *def_port,
     vss_resolved_f *func, void *priv, const char **err, int socktype);
-struct suckaddr *VSS_ResolveOne(void *dst,
+const struct suckaddr *VSS_ResolveOne(void *dst,
     const char *addr, const char *port,
     int family, int socktype, int flags);
-struct suckaddr *VSS_ResolveFirst(void *dst,
+const struct suckaddr *VSS_ResolveFirst(void *dst,
     const char *addr, const char *port,
     int family, int socktype, int flags);
diff --git a/lib/libvarnish/vsa.c b/lib/libvarnish/vsa.c
index d1f1c91a0..c03fbf91f 100644
--- a/lib/libvarnish/vsa.c
+++ b/lib/libvarnish/vsa.c
@@ -247,10 +247,11 @@ socklen_t sua_len(const struct sockaddr *sa)
  * Malloc a suckaddr from a sockaddr of some kind.
  */
 
-struct suckaddr *
+const struct suckaddr *
 VSA_Malloc(const void *s, unsigned  sal)
 {
-	return (VSA_Build(malloc(vsa_suckaddr_len), s, sal));
+
+	return (VSA_Build(NULL, s, sal));
 }
 
 /* 'd' SHALL point to vsa_suckaddr_len aligned bytes of storage
@@ -262,7 +263,7 @@ VSA_Malloc(const void *s, unsigned  sal)
  * NULL or 0 length argument are ignored.
  * argument of the wrong length are an error (NULL return value, EINVAL)
  */
-struct suckaddr *
+const struct suckaddr *
 VSA_BuildFAP(void *d, sa_family_t fam, const void *a, unsigned al,
 	    const void *p, unsigned pl)
 {
@@ -306,20 +307,23 @@ VSA_BuildFAP(void *d, sa_family_t fam, const void *a, unsigned al,
 	return (NULL);
 }
 
-/* 'd' SHALL point to vsa_suckaddr_len aligned bytes of storage */
-struct suckaddr *
+const struct suckaddr *
 VSA_Build(void *d, const void *s, unsigned sal)
 {
 	struct suckaddr *sua;
 	const struct sockaddr *sa = s;
 	unsigned l;	// for flexelint
 
-	AN(d);
 	AN(s);
 	l = sua_len(sa);
 	if (l == 0 || l != sal)
 		return (NULL);
 
+	if (d == NULL) {
+		d = malloc(vsa_suckaddr_len);
+		AN(d);
+	}
+
 	sua = d;
 
 	INIT_OBJ(sua, SUCKADDR_MAGIC);
@@ -399,7 +403,7 @@ VSA_Compare_IP(const struct suckaddr *sua1, const struct suckaddr *sua2)
 	NEEDLESS(return (-1));
 }
 
-struct suckaddr *
+const struct suckaddr *
 VSA_Clone(const struct suckaddr *sua)
 {
 	struct suckaddr *sua2;
@@ -427,7 +431,7 @@ VSA_Port(const struct suckaddr *sua)
 }
 
 #define VSA_getname(which)				\
-struct suckaddr *					\
+const struct suckaddr *					\
 VSA_get ## which ## name(int fd, void *d, size_t l)	\
 {							\
 	struct suckaddr *sua;				\
@@ -452,3 +456,13 @@ VSA_get ## which ## name(int fd, void *d, size_t l)	\
 VSA_getname(sock)
 VSA_getname(peer)
 #undef VSA_getname
+
+void
+VSA_free(const struct suckaddr **vsap)
+{
+	const struct suckaddr *vsa;
+
+	TAKE_OBJ_NOTNULL(vsa, vsap, SUCKADDR_MAGIC);
+	free(TRUST_ME(vsa));
+}
+
diff --git a/lib/libvarnish/vss.c b/lib/libvarnish/vss.c
index 45a3d2f2a..4601f27d5 100644
--- a/lib/libvarnish/vss.c
+++ b/lib/libvarnish/vss.c
@@ -139,7 +139,7 @@ vss_resolve(const char *addr, const char *def_port, int family, int socktype,
 	return (ret);
 }
 
-static struct suckaddr *
+static const struct suckaddr *
 vss_alloc_suckaddr(void *dst, const struct addrinfo *ai)
 {
 
@@ -162,7 +162,7 @@ VSS_resolver_socktype(const char *addr, const char *def_port,
     vss_resolved_f *func, void *priv, const char **errp, int socktype)
 {
 	struct addrinfo *res0 = NULL, *res;
-	struct suckaddr *vsa;
+	const struct suckaddr *vsa;
 	int ret;
 
 	AN(addr);
@@ -178,7 +178,7 @@ VSS_resolver_socktype(const char *addr, const char *def_port,
 		vsa = VSA_Malloc(res->ai_addr, res->ai_addrlen);
 		if (vsa != NULL) {
 			ret = func(priv, vsa);
-			free(vsa);
+			VSA_free(&vsa);
 			if (ret)
 				break;
 		}
@@ -195,12 +195,12 @@ VSS_resolver(const char *addr, const char *def_port, vss_resolved_f *func,
 	    addr, def_port, func, priv, errp, SOCK_STREAM));
 }
 
-struct suckaddr *
+const struct suckaddr *
 VSS_ResolveOne(void *dst, const char *addr, const char *def_port,
     int family, int socktype, int flags)
 {
 	struct addrinfo *res = NULL;
-	struct suckaddr *retval = NULL;
+	const struct suckaddr *retval = NULL;
 	const char *err;
 	int ret;
 
@@ -215,12 +215,12 @@ VSS_ResolveOne(void *dst, const char *addr, const char *def_port,
 	return (retval);
 }
 
-struct suckaddr *
+const struct suckaddr *
 VSS_ResolveFirst(void *dst, const char *addr, const char *def_port,
     int family, int socktype, int flags)
 {
 	struct addrinfo *res0 = NULL, *res;
-	struct suckaddr *retval = NULL;
+	const struct suckaddr *retval = NULL;
 	const char *err;
 	int ret;
 
diff --git a/lib/libvarnish/vtcp.c b/lib/libvarnish/vtcp.c
index 6c1d154a2..d46142b46 100644
--- a/lib/libvarnish/vtcp.c
+++ b/lib/libvarnish/vtcp.c
@@ -134,7 +134,7 @@ void
 VTCP_hisname(int sock, char *abuf, unsigned alen, char *pbuf, unsigned plen)
 {
 	char buf[vsa_suckaddr_len];
-	struct suckaddr *sua;
+	const struct suckaddr *sua;
 
 	sua = VSA_getpeername(sock, buf, sizeof buf);
 	if (sua != NULL)
diff --git a/lib/libvcc/vcc_acl.c b/lib/libvcc/vcc_acl.c
index 4ccefea4f..811f0bf3b 100644
--- a/lib/libvcc/vcc_acl.c
+++ b/lib/libvcc/vcc_acl.c
@@ -164,7 +164,7 @@ vcc_acl_chk(struct vcc *tl, const struct acl_e *ae, const int l,
 	char t[VTCP_ADDRBUFSIZE + 10];
 	char s[vsa_suckaddr_len];
 	char *r = NULL;
-	struct suckaddr *sa;
+	const struct suckaddr *sa;
 	unsigned m;
 	int ll, ret = 0;
 
diff --git a/lib/libvcc/vcc_utils.c b/lib/libvcc/vcc_utils.c
index 9264200c1..50abffe75 100644
--- a/lib/libvcc/vcc_utils.c
+++ b/lib/libvcc/vcc_utils.c
@@ -173,8 +173,8 @@ struct rss {
 	unsigned		magic;
 #define RSS_MAGIC		0x11e966ab
 
-	struct suckaddr		*vsa4;
-	struct suckaddr		*vsa6;
+	const struct suckaddr	*vsa4;
+	const struct suckaddr	*vsa6;
 	struct vsb		*vsb;
 	int			retval;
 	int			wrong;
@@ -246,8 +246,10 @@ Resolve_Sockaddr(struct vcc *tl,
 		    "(Sorry if that error message is gibberish.)\n",
 		    errid, PF(t_err), err);
 		vcc_ErrWhere(tl, t_err);
-		free(rss->vsa4);
-		free(rss->vsa6);
+		if (rss->vsa4 != NULL)
+			VSA_free(&rss->vsa4);
+		if (rss->vsa6 != NULL)
+			VSA_free(&rss->vsa6);
 		VSB_destroy(&rss->vsb);
 		ZERO_OBJ(rss, sizeof rss);
 		return;
@@ -255,11 +257,11 @@ Resolve_Sockaddr(struct vcc *tl,
 	AZ(error);
 	if (rss->vsa4 != NULL) {
 		vcc_suckaddr(tl, host, rss->vsa4, ipv4, ipv4_ascii, p_ascii);
-		free(rss->vsa4);
+		VSA_free(&rss->vsa4);
 	}
 	if (rss->vsa6 != NULL) {
 		vcc_suckaddr(tl, host, rss->vsa6, ipv6, ipv6_ascii, p_ascii);
-		free(rss->vsa6);
+		VSA_free(&rss->vsa6);
 	}
 	if (rss->retval == 0) {
 		VSB_printf(tl->sb,
diff --git a/vmod/vmod_debug_dyn.c b/vmod/vmod_debug_dyn.c
index 8e9676c2c..2f1a1d180 100644
--- a/vmod/vmod_debug_dyn.c
+++ b/vmod/vmod_debug_dyn.c
@@ -64,7 +64,7 @@ static void
 dyn_dir_init(VRT_CTX, struct xyzzy_debug_dyn *dyn,
      VCL_STRING addr, VCL_STRING port, VCL_PROBE probe)
 {
-	struct suckaddr *sa;
+	const struct suckaddr *sa;
 	VCL_BACKEND dir, dir2;
 	struct vrt_endpoint vep;
 	struct vrt_backend vrt;
@@ -105,7 +105,7 @@ dyn_dir_init(VRT_CTX, struct xyzzy_debug_dyn *dyn,
 	if (dir2 != NULL)
 		VRT_delete_backend(ctx, &dir2);
 
-	free(sa);
+	VSA_free(&sa);
 }
 
 VCL_VOID


More information about the varnish-commit mailing list