[Varnish] #1332: ENUM in Object member method hides subsequent methods
Varnish
varnish-bugs at varnish-cache.org
Tue Aug 6 15:20:47 CEST 2013
#1332: ENUM in Object member method hides subsequent methods
---------------------------+--------------------
Reporter: jw | Type: defect
Status: new | Priority: normal
Milestone: | Component: build
Version: trunk | Severity: normal
Keywords: vmod VCL_ENUM |
---------------------------+--------------------
When an object contains a method that takes an ENUM as arguments, methods
after the enums can not be reached in VCL. Consider the following
vmod.vcc:
{{{
Module etest
Object etest() {
Method VOID .bar(ENUM { AA, BB, CC, DD })
Method VOID .foo()
}
}}}
foo becomes invisible the the VCL compiler:
{{{
backend default {
.host = "127.0.0.1";
.port = "80";
}
backend b1 {
.host = "192.168.100.11";
.port = "8000";
}
import etest;
sub vcl_init
{
new et = etest.etest();
}
sub vcl_recv {
et.foo();
et.bar(AA);
set req.backend = b1;
}
}}}
{{{
./sbin/varnishd -a 127.0.0.1:8080 -d -f ./etc/varnish/default.vcl -C
Message from VCC-compiler:
Not running as root, no priv-sep
Expected an action, 'if', '{' or '}'
('input' Line 19 Pos 9)
et.foo();
--------######---
}}}
Switching the position of foo and bar in vmod.vcc "solves" the issue, as
there is no method after. The reason seems to be, that ENUM ends with
\0\0, plus a third \0 for the Method ends appears as \0\0\0 just as the
end of the Object definition.
const char * const Vmod_etest_Spec[] = {
/* Object etest */
"OBJ\0"
"etest.etest\0Vmod_etest_Func.etest__init\0VOID\0\0"
"struct vmod_etest_etest\0"
"etest.etest\0Vmod_etest_Func.etest__fini\0VOID\0\0"
"etest.etest.bar\0Vmod_etest_Func.etest_bar\0VOID\0ENUM\0AA\0BB\0CC\0DD\0\0\0"
"etest.etest.foo\0Vmod_etest_Func.etest_foo\0VOID\0\0"
"\0",
/* Functions */
/* Init/Fini */
0
};
Just for the case you want to reproduce: etest.c
{{{
#include <stdlib.h>
#include "vrt.h"
#include "cache/cache.h"
#include "vcc_if.h"
struct vmod_etest_etest {
unsigned magic; //needed
#define VMOD_ETEST_ETEST_MAGIC 0x9454a5ce
};
VCL_VOID __match_proto__(td_etest_etest__init)
vmod_etest__init(const struct vrt_ctx *ctx, struct vmod_etest_etest
**etestp, const char *vcl_name)
{
struct vmod_etest_etest *etest;
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
AN(etestp);
AZ(*etestp);
ALLOC_OBJ(etest, VMOD_ETEST_ETEST_MAGIC);
AN(etest);
*etestp = etest;
}
VCL_VOID __match_proto__(td_etest_etest__fini)
vmod_etest__fini(struct vmod_etest_etest **etestp)
{
struct vmod_etest_etest *etest;
etest = *etestp;
*etestp = NULL;
CHECK_OBJ_NOTNULL(etest, VMOD_ETEST_ETEST_MAGIC);
FREE_OBJ(etest);
}
VCL_VOID __match_proto__(td_etest_etest_foo)
vmod_etest_foo(const struct vrt_ctx *ctx, struct vmod_etest_etest *etest)
{
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(etest, VMOD_ETEST_ETEST_MAGIC);
txt t;
char *msg = "DEBUG etest.foo()";
t.b = msg;
t.e = msg + strlen(msg);
VSLbt(ctx->vsl, SLT_Debug, t);
}
VCL_VOID __match_proto__(td_etest_etest_bar)
vmod_etest_bar(const struct vrt_ctx *ctx, struct vmod_etest_etest *etest,
VCL_ENUM e)
{
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(etest, VMOD_ETEST_ETEST_MAGIC);
txt t;
char *msg = "DEBUG etest.bar()";
t.b = msg;
t.e = msg + strlen(msg);
VSLbt(ctx->vsl, SLT_Debug, t);
}
}}}
--
Ticket URL: <https://www.varnish-cache.org/trac/ticket/1332>
Varnish <https://varnish-cache.org/>
The Varnish HTTP Accelerator
More information about the varnish-bugs
mailing list