[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