[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