[master] 50e03b07f fix bug in abstract sockets

Nils Goroll nils.goroll at uplex.de
Mon Mar 20 11:01:06 UTC 2023


commit 50e03b07fd569ee331566863cce9316df8b526bc
Author: Walid Boudebouda <walid.boudebouda at gmail.com>
Date:   Thu Mar 16 18:32:35 2023 +0100

    fix bug in abstract sockets
    
    with uds abstract sockets, sun_path should start with a NULL character followed
    by the socket's name. The name is not considered to be NULL terminated and can
    contain NULL bytes which have no special meaning. socklen is used to determine
    the length of name and must be set to the length of the struct sockaddr_un up to
    the last character of name, otherwise the 108 characters of sun_path will be
    treated as the name of the socket, including NULL bytes.

diff --git a/bin/varnishtest/vtc_client.c b/bin/varnishtest/vtc_client.c
index fb7277d5c..8fb3bdd3e 100644
--- a/bin/varnishtest/vtc_client.c
+++ b/bin/varnishtest/vtc_client.c
@@ -127,7 +127,9 @@ uds_open(void *priv, const struct sockaddr_un *uds)
 	double *p;
 	int s, i, tmo;
 	struct pollfd fds[1];
-	socklen_t sl = sizeof(*uds);
+	socklen_t sl;
+
+	sl = VUS_socklen(uds);
 
 	AN(priv);
 	AN(uds);
diff --git a/include/vus.h b/include/vus.h
index 20d56fd15..c818f3939 100644
--- a/include/vus.h
+++ b/include/vus.h
@@ -36,6 +36,7 @@ int VUS_resolver(const char *path, vus_resolved_f *func, void *priv,
 		 const char **err);
 int VUS_bind(const struct sockaddr_un *uds, const char **errp);
 int VUS_connect(const char *path, int msec);
+unsigned int VUS_socklen(const struct sockaddr_un *uds);
 
 static inline int
 VUS_is(const char *path)
diff --git a/lib/libvarnish/vus.c b/lib/libvarnish/vus.c
index c9920ef28..a110a1ec1 100644
--- a/lib/libvarnish/vus.c
+++ b/lib/libvarnish/vus.c
@@ -86,6 +86,8 @@ VUS_resolver(const char *path, vus_resolved_f *func, void *priv,
 	if (ret)
 		return (ret);
 
+	assert(uds.sun_path[1] != '\0');
+
 	if (func != NULL)
 		ret = func(priv, &uds);
 	return (ret);
@@ -95,7 +97,9 @@ int
 VUS_bind(const struct sockaddr_un *uds, const char **errp)
 {
 	int sd, e;
-	socklen_t sl = sizeof(*uds);
+	socklen_t sl;
+
+	sl = VUS_socklen(uds);
 
 	if (errp != NULL)
 		*errp = NULL;
@@ -133,13 +137,18 @@ VUS_connect(const char *path, int msec)
 	int s, i;
 	struct pollfd fds[1];
 	struct sockaddr_un uds;
-	socklen_t sl = (socklen_t) sizeof(uds);
+	socklen_t sl;
 
 	if (path == NULL)
 		return (-1);
 	i = sun_init(&uds, path, NULL);
 	if (i)
 		return (i);
+
+	assert(uds.sun_path[1] != '\0');
+
+	sl = VUS_socklen(&uds);
+
 	AN(sl);
 
 	s = socket(PF_UNIX, SOCK_STREAM, 0);
@@ -182,3 +191,19 @@ VUS_connect(const char *path, int msec)
 
 	return (VTCP_connected(s));
 }
+
+socklen_t
+VUS_socklen(const struct sockaddr_un *uds)
+{
+	socklen_t sl;
+	char *p;
+	if (*uds->sun_path)
+		sl = sizeof(*uds);
+	else {
+		p = strchr(uds->sun_path + 1, '\0');
+		assert(p != NULL);
+		sl = p - (const char*)uds;
+	}
+	assert(sl <= sizeof(*uds));
+	return sl;
+}


More information about the varnish-commit mailing list