[master] 2216efa Change calling convention to VSS_parse() to give it a mutable string into which pointers are returned.

Poul-Henning Kamp phk at FreeBSD.org
Mon Mar 2 10:06:16 CET 2015


commit 2216efa1c001c78704a6dcf1c38258c8a3188908
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Mon Mar 2 09:05:31 2015 +0000

    Change calling convention to VSS_parse() to give it a mutable string
    into which pointers are returned.
    
    This simplifies the code enough that FlexeLint doesn't get confused.

diff --git a/bin/varnishtest/tests/v00038.vtc b/bin/varnishtest/tests/v00038.vtc
index 7de4517..7fb006d 100644
--- a/bin/varnishtest/tests/v00038.vtc
+++ b/bin/varnishtest/tests/v00038.vtc
@@ -1,11 +1,17 @@
 varnishtest "VCL compiler coverage test: vcc_backend.c"
 
-varnish v1 -errvcl "IPv6 address [] wrong" {
+varnish v1 -errvcl "IPv6 address lacks ']'" {
 	backend b1 {
 		.host = "[0:0:0:0";
 	}
 }
 
+varnish v1 -errvcl "IPv6 address has wrong port separator" {
+	backend b1 {
+		.host = "[0:0:0:0]/0";
+	}
+}
+
 varnish v1 -errvcl "with exactly three digits" {
 	backend b1 {
 		.host = "127.0.0.1";
diff --git a/include/vss.h b/include/vss.h
index af41057..c015df5 100644
--- a/include/vss.h
+++ b/include/vss.h
@@ -29,7 +29,7 @@
 /* vss.c */
 struct vss_addr;
 
-const char *VSS_parse(const char *str, char **addr, char **port);
+const char *VSS_parse(char *str, char **addr, char **port);
 int VSS_resolve(const char *addr, const char *port, struct vss_addr ***ta);
 int VSS_bind(const struct vss_addr *addr);
 int VSS_listen(const struct vss_addr *addr, int depth);
diff --git a/lib/libvarnish/vss.c b/lib/libvarnish/vss.c
index 85b3d67..d5bc65f 100644
--- a/lib/libvarnish/vss.c
+++ b/lib/libvarnish/vss.c
@@ -72,43 +72,36 @@ struct vss_addr {
  */
 
 const char *
-VSS_parse(const char *str, char **addr, char **port)
+VSS_parse(char *str, char **addr, char **port)
 {
-	const char *p;
+	char *p;
 
 	*addr = *port = NULL;
 
 	if (str[0] == '[') {
 		/* IPv6 address of the form [::1]:80 */
-		if ((p = strchr(str, ']')) == NULL ||
-		    p == str + 1 ||
-		    (p[1] != '\0' && p[1] != ':'))
-			return ("IPv6 address [] wrong.");
-		*addr = strdup(str + 1);
-		XXXAN(*addr);
-		(*addr)[p - (str + 1)] = '\0';
-		if (p[1] == ':') {
-			*port = strdup(p + 2);
-			XXXAN(*port);
-		}
+		*addr = str + 1;
+		p = strchr(str, ']');
+		if (p == NULL)
+			return ("IPv6 address lacks ']'");
+		*p++ = '\0';
+		if (*p == '\0')
+			return (NULL);
+		if (*p != ' ' && *p != ':')
+			return ("IPv6 address has wrong port separator");
 	} else {
 		/* IPv4 address of the form 127.0.0.1:80, or non-numeric */
+		*addr = str;
 		p = strchr(str, ' ');
 		if (p == NULL)
 			p = strchr(str, ':');
-		if (p == NULL) {
-			*addr = strdup(str);
-			XXXAN(*addr);
-		} else {
-			if (p > str) {
-				*addr = strdup(str);
-				XXXAN(*addr);
-				(*addr)[p - str] = '\0';
-			}
-			*port = strdup(p + 1);
-			XXXAN(*port);
-		}
+		if (p == NULL)
+			return (NULL);
+		if (p == str)
+			*addr = NULL;
 	}
+	*p++ = '\0';
+	*port = p;
 	return (NULL);
 }
 
@@ -136,6 +129,7 @@ VSS_resolve(const char *addr, const char *port, struct vss_addr ***vap)
 	struct vss_addr **va;
 	int i, ret;
 	long int ptst;
+	char *h;
 	char *adp, *hop;
 
 	*vap = NULL;
@@ -143,23 +137,25 @@ VSS_resolve(const char *addr, const char *port, struct vss_addr ***vap)
 	hints.ai_socktype = SOCK_STREAM;
 	hints.ai_flags = AI_PASSIVE;
 
-	if (VSS_parse(addr, &hop, &adp) != NULL)
+	h = strdup(addr);
+	AN(h);
+	if (VSS_parse(h, &hop, &adp) != NULL) {
+		free(h);
 		return (0);
+	}
 
 	if (adp == NULL)
 		ret = getaddrinfo(addr, port, &hints, &res0);
 	else {
 		ptst = strtol(adp, NULL, 10);
 		if (ptst < 0 || ptst > 65535) {
-			free(hop);
-			free(adp);
+			free(h);
 			return(0);
 		}
 		ret = getaddrinfo(hop, adp, &hints, &res0);
 	}
 
-	free(hop);
-	free(adp);
+	free(h);
 
 	if (ret != 0)
 		return (0);
diff --git a/lib/libvcc/vcc_backend.c b/lib/libvcc/vcc_backend.c
index 800f3af..c9cc681 100644
--- a/lib/libvcc/vcc_backend.c
+++ b/lib/libvcc/vcc_backend.c
@@ -48,11 +48,14 @@ Emit_Sockaddr(struct vcc *tl, const struct token *t_host, const char *port)
 {
 	const char *ipv4, *ipv4a, *ipv6, *ipv6a, *pa;
 	const char *err;
+	char *p;
 	char *hop, *pop;
 
 	AN(t_host->dec);
 
-	err = VSS_parse(t_host->dec, &hop, &pop);
+	p = TlDup(tl, t_host->dec);
+	AN(p);
+	err = VSS_parse(p, &hop, &pop);
 	if (err != NULL) {
 		VSB_printf(tl->sb,
 		    "Backend host '%.*s': %s\n", PF(t_host), err);



More information about the varnish-commit mailing list