[master] ae5c7e2 Fix a very strange corner-case of vcl syntax level handling.

Poul-Henning Kamp phk at FreeBSD.org
Tue Feb 27 13:40:18 UTC 2018


commit ae5c7e25abb4fd0dcda26ca112d257bf3c705c34
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Tue Feb 27 13:38:52 2018 +0000

    Fix a very strange corner-case of vcl syntax level handling.
    
    Spotted by:	simon

diff --git a/lib/libvcc/vcc_compile.h b/lib/libvcc/vcc_compile.h
index 696aa6a..2d9478b 100644
--- a/lib/libvcc/vcc_compile.h
+++ b/lib/libvcc/vcc_compile.h
@@ -76,7 +76,6 @@ struct symbol;
 
 struct source {
 	VTAILQ_ENTRY(source)	list;
-	int			syntax;
 	char			*name;
 	const char		*b;
 	const char		*e;
diff --git a/lib/libvcc/vcc_parse.c b/lib/libvcc/vcc_parse.c
index 0326298..eb82b52 100644
--- a/lib/libvcc/vcc_parse.c
+++ b/lib/libvcc/vcc_parse.c
@@ -276,6 +276,7 @@ static void
 vcc_ParseVcl(struct vcc *tl)
 {
 	struct token *tok0, *tok1, *tok2;
+	int syntax;
 
 	assert(vcc_IdIs(tl->t, "vcl"));
 	tok0 = tl->t;
@@ -283,14 +284,14 @@ vcc_ParseVcl(struct vcc *tl)
 
 	tok1 = tl->t;
 	Expect(tl, CNUM);
-	tok1->src->syntax = (*tl->t->b - '0') * 10;
+	syntax = (*tl->t->b - '0') * 10;
 	vcc_NextToken(tl);
 	Expect(tl, '.');
 	vcc_NextToken(tl);
 
 	Expect(tl, CNUM);
 	tok2 = tl->t;
-	tok1->src->syntax += (*tl->t->b - '0');
+	syntax += (*tl->t->b - '0');
 	vcc_NextToken(tl);
 
 	if (tok1->e - tok1->b != 1 || tok2->e - tok2->b != 1) {
@@ -300,6 +301,13 @@ vcc_ParseVcl(struct vcc *tl)
 		ERRCHK(tl);
 	}
 
+	if (syntax < VCL_LOW || syntax > VCL_HIGH) {
+		VSB_printf(tl->sb, "VCL version %.1f not supported.\n",
+		    .1 * syntax);
+		vcc_ErrWhere2(tl, tok0, tl->t);
+		ERRCHK(tl);
+	}
+
 	if (tl->t->tok != ';') {
 		/* Special handling, because next token might be 'vcl'
 		 * in the built-in VCL, and that would give a very
@@ -311,11 +319,13 @@ vcc_ParseVcl(struct vcc *tl)
 		ERRCHK(tl);
 	}
 	vcc_NextToken(tl);
-	if (tl->syntax != 0.0 && tok1->src->syntax > tl->syntax) {
+	if (tl->syntax == 0)
+		tl->syntax = syntax;
+	if (syntax > tl->syntax) {
 		VSB_printf(tl->sb,
 		    "VCL version %.1f higher than"
 		    " the top level version %.1f\n",
-		    .1 * tok1->src->syntax, .1 * tl->syntax);
+		    .1 * syntax, .1 * tl->syntax);
 		vcc_ErrWhere2(tl, tok0, tl->t);
 		ERRCHK(tl);
 	}
@@ -352,7 +362,6 @@ void
 vcc_Parse(struct vcc *tl)
 {
 	struct toplev *tp;
-	struct token *tok;
 
 	AZ(tl->indent);
 	if (tl->t->tok != ID || !vcc_IdIs(tl->t, "vcl")) {
@@ -365,16 +374,9 @@ vcc_Parse(struct vcc *tl)
 		vcc_ErrWhere(tl, tl->t);
 		ERRCHK(tl);
 	}
-	tok = tl->t;
 	vcc_ParseVcl(tl);
-	if (tok->src->syntax < VCL_LOW || tok->src->syntax > VCL_HIGH) {
-		VSB_printf(tl->sb, "VCL version %.1f not supported.\n",
-		    .1 * tok->src->syntax);
-		vcc_ErrWhere2(tl, tok, tl->t);
-		ERRCHK(tl);
-	}
-	tl->syntax = tl->t->src->syntax;
 	ERRCHK(tl);
+	AN(tl->syntax);
 	while (tl->t->tok != EOI) {
 		ERRCHK(tl);
 		switch (tl->t->tok) {


More information about the varnish-commit mailing list