Commit 169e162c authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Enforce that VCL names must be C-language identifiers ([A-Za-z][A-Za-z0-9_]*)

parent 8f7ac0fc
......@@ -42,6 +42,7 @@
#include "libvcc.h"
#include "vcli_serve.h"
#include "vct.h"
#include "vev.h"
#include "vtim.h"
......@@ -81,6 +82,74 @@ static struct vev *e_poker;
/*--------------------------------------------------------------------*/
static struct vclprog *
mcf_vcl_byname(const char *name)
{
struct vclprog *vp;
VTAILQ_FOREACH(vp, &vclhead, list)
if (!strcmp(name, vp->name))
return (vp);
return (NULL);
}
static int
mcf_bad_vclname(struct cli *cli, const char *name)
{
const char *p;
int bad = 0;
AN(name);
p = name;
if (!vct_isalpha(*p))
bad = *p;
for (p++; bad == 0 && *p != '\0'; p++)
if (!vct_isalpha(*p) && !vct_isdigit(*p) && *p != '_')
bad = *p;
if (bad) {
VCLI_SetResult(cli, CLIS_PARAM);
VCLI_Out(cli, "Illegal character in VCL name ");
if (bad > 0x20 && bad < 0x7f)
VCLI_Out(cli, "('%c')", bad);
else
VCLI_Out(cli, "(0x%02x)", bad & 0xff);
}
return (bad);
}
static struct vclprog *
mcf_find_vcl(struct cli *cli, const char *name)
{
struct vclprog *vp;
if (mcf_bad_vclname(cli, name))
return (NULL);
vp = mcf_vcl_byname(name);
if (vp == NULL) {
VCLI_SetResult(cli, CLIS_PARAM);
VCLI_Out(cli, "No VCL named %s known.", name);
}
return (vp);
}
static int
mcf_find_no_vcl(struct cli *cli, const char *name)
{
if (mcf_bad_vclname(cli, name))
return (0);
if (mcf_vcl_byname(name) != NULL) {
VCLI_SetResult(cli, CLIS_PARAM);
VCLI_Out(cli, "Already a VCL named %s", name);
return (0);
}
return (1);
}
/*--------------------------------------------------------------------*/
static void
mgt_vcl_dep_add(struct vclprog *vp_from, struct vclprog *vp_to)
{
......@@ -163,17 +232,6 @@ mgt_vcl_del(struct vclprog *vp)
FREE_OBJ(vp);
}
static struct vclprog *
mgt_vcl_byname(const char *name)
{
struct vclprog *vp;
VTAILQ_FOREACH(vp, &vclhead, list)
if (!strcmp(name, vp->name))
return (vp);
return (NULL);
}
void
mgt_vcl_depends(struct vclprog *vp1, const char *name)
{
......@@ -181,7 +239,7 @@ mgt_vcl_depends(struct vclprog *vp1, const char *name)
CHECK_OBJ_NOTNULL(vp1, VCLPROG_MAGIC);
vp2 = mgt_vcl_byname(name);
vp2 = mcf_vcl_byname(name);
CHECK_OBJ_NOTNULL(vp2, VCLPROG_MAGIC);
mgt_vcl_dep_add(vp1, vp2);
}
......@@ -390,16 +448,11 @@ mgt_push_vcls_and_start(struct cli *cli, unsigned *status, char **p)
static void __match_proto__(cli_func_t)
mcf_vcl_inline(struct cli *cli, const char * const *av, void *priv)
{
struct vclprog *vp;
(void)priv;
vp = mgt_vcl_byname(av[2]);
if (vp != NULL) {
VCLI_Out(cli, "Already a VCL program named %s", av[2]);
VCLI_SetResult(cli, CLIS_PARAM);
if (!mcf_find_no_vcl(cli, av[2]))
return;
}
mgt_new_vcl(cli, av[2], av[3], "<vcl.inline>", av[4], 0);
}
......@@ -407,31 +460,14 @@ mcf_vcl_inline(struct cli *cli, const char * const *av, void *priv)
static void __match_proto__(cli_func_t)
mcf_vcl_load(struct cli *cli, const char * const *av, void *priv)
{
struct vclprog *vp;
(void)priv;
vp = mgt_vcl_byname(av[2]);
if (vp != NULL) {
VCLI_Out(cli, "Already a VCL program named %s", av[2]);
VCLI_SetResult(cli, CLIS_PARAM);
if (!mcf_find_no_vcl(cli, av[2]))
return;
}
mgt_new_vcl(cli, av[2], NULL, av[3], av[4], 0);
}
static struct vclprog *
mcf_find_vcl(struct cli *cli, const char *name)
{
struct vclprog *vp;
vp = mgt_vcl_byname(name);
if (vp == NULL) {
VCLI_SetResult(cli, CLIS_PARAM);
VCLI_Out(cli, "No configuration named %s known.", name);
}
return (vp);
}
static void __match_proto__(cli_func_t)
mcf_vcl_state(struct cli *cli, const char * const *av, void *priv)
......@@ -614,6 +650,10 @@ mcf_vcl_label(struct cli *cli, const char * const *av, void *priv)
int i;
(void)priv;
if (mcf_bad_vclname(cli, av[2]))
return;
if (mcf_bad_vclname(cli, av[3]))
return;
vpt = mcf_find_vcl(cli, av[3]);
if (vpt == NULL)
return;
......@@ -628,7 +668,7 @@ mcf_vcl_label(struct cli *cli, const char * const *av, void *priv)
vpt->label->name);
return;
}
vpl = mgt_vcl_byname(av[2]);
vpl = mcf_vcl_byname(av[2]);
if (vpl != NULL) {
if (strcmp(vpl->state, VCL_STATE_LABEL)) {
VCLI_SetResult(cli, CLIS_PARAM);
......@@ -643,12 +683,6 @@ mcf_vcl_label(struct cli *cli, const char * const *av, void *priv)
mgt_vcl_dep_del(VTAILQ_FIRST(&vpl->dfrom));
AN(VTAILQ_EMPTY(&vpl->dfrom));
} else {
/* XXX should check for C-syntax */
if (strchr(av[2], '.')) {
VCLI_SetResult(cli, CLIS_PARAM);
VCLI_Out(cli, "VCL labels cannot contain '.'");
return;
}
vpl = mgt_vcl_add(av[2], VCL_STATE_LABEL);
}
AN(vpl);
......
......@@ -7,6 +7,11 @@ server s1 {
varnish v1 -vcl+backend {}
# VCL name must be C-names
varnish v1 -clierr 106 {vcl.inline 0000 "vcl 4.0; backend b { .host = \"localhost\";} "}
varnish v1 -clierr 106 {vcl.inline a00/ "vcl 4.0; backend b { .host = \"localhost\";} "}
varnish v1 -clierr 106 {vcl.inline a00å "vcl 4.0; backend b { .host = \"localhost\";} "}
varnish v1 -vcl+backend {
sub vcl_recv {
return (synth(400));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment