[master] 474b9fc Also check for duplicate definitions of backends, probes and acls.

Poul-Henning Kamp phk at varnish-cache.org
Mon May 23 11:07:19 CEST 2011


commit 474b9fcedbc7f056b6e7dc09e8231f08c16d8e12
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Mon May 23 09:06:47 2011 +0000

    Also check for duplicate definitions of backends, probes and acls.

diff --git a/bin/varnishtest/tests/v00034.vtc b/bin/varnishtest/tests/v00034.vtc
index c73994b..fdc6e20 100644
--- a/bin/varnishtest/tests/v00034.vtc
+++ b/bin/varnishtest/tests/v00034.vtc
@@ -1,4 +1,4 @@
-varnishtest "Test sub redefinition"
+varnishtest "Test sub and backend redefinition"
 
 server s1 {
 	rxreq
@@ -13,3 +13,14 @@ varnish v1 -badvcl {
 	sub c1 { }
 	sub vcl_recv { call c1; }
 }
+
+varnish v1 -badvcl {
+	backend s1 { .host = "127.0.0.1"; }
+	backend s1 { .host = "127.0.0.1"; }
+}
+
+varnish v1 -badvcl {
+	backend s1 { .host = "127.0.0.1"; .probe = p1;}
+	probe p1 { }
+	probe p1 { }
+}
diff --git a/lib/libvcl/vcc_acl.c b/lib/libvcl/vcc_acl.c
index 6d7e629..e344d3d 100644
--- a/lib/libvcl/vcc_acl.c
+++ b/lib/libvcl/vcc_acl.c
@@ -465,6 +465,7 @@ void
 vcc_Acl(struct vcc *tl)
 {
 	struct token *an;
+	int i;
 	char acln[1024];
 
 	vcc_NextToken(tl);
@@ -474,7 +475,12 @@ vcc_Acl(struct vcc *tl)
 	an = tl->t;
 	vcc_NextToken(tl);
 
-	vcc_AddDef(tl, an, SYM_ACL);
+	i = vcc_AddDef(tl, an, SYM_ACL);
+	if (i > 1) {
+		vsb_printf(tl->sb, "ACL %.*s redefined\n", PF(an));
+		vcc_ErrWhere(tl, an);
+		return;
+	}
 	bprintf(acln, "%.*s", PF(an));
 
 	SkipToken(tl, '{');
diff --git a/lib/libvcl/vcc_backend.c b/lib/libvcl/vcc_backend.c
index e8cd700..ab102bb 100644
--- a/lib/libvcl/vcc_backend.c
+++ b/lib/libvcl/vcc_backend.c
@@ -412,6 +412,7 @@ void
 vcc_ParseProbe(struct vcc *tl)
 {
 	struct token *t_probe;
+	int i;
 
 	vcc_NextToken(tl);		/* ID: probe */
 
@@ -419,7 +420,11 @@ vcc_ParseProbe(struct vcc *tl)
 	ERRCHK(tl);
 	t_probe = tl->t;
 	vcc_NextToken(tl);
-	vcc_AddDef(tl, t_probe, SYM_PROBE);
+	i = vcc_AddDef(tl, t_probe, SYM_PROBE);
+	if (i > 1) {
+		vsb_printf(tl->sb, "Probe %.*s redefined\n", PF(t_probe));
+		vcc_ErrWhere(tl, t_probe);
+	}
 
 	Fh(tl, 0, "\n#define vgc_probe_%.*s\tvgc_probe__%d\n",
 	    PF(t_probe), tl->nprobe);
@@ -682,6 +687,11 @@ vcc_DefBackend(struct vcc *tl, const struct token *nm)
 
 	sym = VCC_GetSymbolTok(tl, nm, SYM_BACKEND);
 	AN(sym);
+	if (sym->ndef > 0) {
+		vsb_printf(tl->sb, "Backend %.*s redefined\n", PF(tl->t));
+		vcc_ErrWhere(tl, nm);
+		return;
+	} 
 	sym->fmt = BACKEND;
 	sym->eval = vcc_Eval_Backend;
 	sym->ndef++;
@@ -700,6 +710,7 @@ vcc_ParseSimpleDirector(struct vcc *tl)
 	h = TlAlloc(tl, sizeof *h);
 	h->name = tl->t_dir;
 	vcc_DefBackend(tl, tl->t_dir);
+	ERRCHK(tl);
 	sprintf(vgcname, "_%.*s", PF(h->name));
 	h->vgcname = TlAlloc(tl, strlen(vgcname) + 1);
 	strcpy(h->vgcname, vgcname);
@@ -748,6 +759,7 @@ vcc_ParseDirector(struct vcc *tl)
 		vcc_ParseSimpleDirector(tl);
 	} else {
 		vcc_DefBackend(tl, tl->t_dir);
+		ERRCHK(tl);
 		ExpectErr(tl, ID);		/* ID: policy */
 		tl->t_policy = tl->t;
 		vcc_NextToken(tl);
diff --git a/lib/libvcl/vcc_parse.c b/lib/libvcl/vcc_parse.c
index 5636b71..34f9c33 100644
--- a/lib/libvcl/vcc_parse.c
+++ b/lib/libvcl/vcc_parse.c
@@ -204,7 +204,7 @@ vcc_Function(struct vcc *tl)
 		assert(m < VCL_MET_MAX);
 		tl->fb = tl->fm[m];
 		if (tl->mprocs[m] == NULL) {
-			vcc_AddDef(tl, tl->t, SYM_SUB);
+			(void)vcc_AddDef(tl, tl->t, SYM_SUB);
 			vcc_AddRef(tl, tl->t, SYM_SUB);
 			tl->mprocs[m] = vcc_AddProc(tl, tl->t);
 		}



More information about the varnish-commit mailing list