[master] 5735a543c Insist that VCL_RET_FAIL goes through VRT_fail() and not VRT_handling()
Dridi Boukelmoune
dridi at varni.sh
Mon Feb 18 20:42:13 UTC 2019
On Tue, Feb 12, 2019 at 11:02 AM Poul-Henning Kamp <phk at freebsd.org> wrote:
>
>
> commit 5735a543c720655c484ef11c70b6cde7f201d5ca
> Author: Poul-Henning Kamp <phk at FreeBSD.org>
> Date: Tue Feb 12 10:01:00 2019 +0000
>
> Insist that VCL_RET_FAIL goes through VRT_fail() and not VRT_handling()
This is a hard VRT breakage, if it's not documented in vrt.h, someone
please fix that.
This will obviously not land in 6.0 when back-ports reach this point.
Dridi
> diff --git a/bin/varnishd/cache/cache_vrt.c b/bin/varnishd/cache/cache_vrt.c
> index 45b4e1399..8940a6797 100644
> --- a/bin/varnishd/cache/cache_vrt.c
> +++ b/bin/varnishd/cache/cache_vrt.c
> @@ -491,11 +491,11 @@ VRT_handling(VRT_CTX, unsigned hand)
> {
>
> CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
> - if (ctx->handling == NULL)
> - return;
> + assert(hand != VCL_RET_FAIL);
> + AN(ctx->handling);
> + AZ(*ctx->handling);
> assert(hand > 0);
> assert(hand < VCL_RET_MAX);
> - // XXX:NOTYET assert(*ctx->handling == 0);
> *ctx->handling = hand;
> }
>
> @@ -507,16 +507,21 @@ VRT_fail(VRT_CTX, const char *fmt, ...)
> va_list ap;
>
> assert(ctx->vsl != NULL || ctx->msg != NULL);
> + AN(ctx->handling);
> + if (*ctx->handling == VCL_RET_FAIL)
> + return;
> + AZ(*ctx->handling);
> + AN(fmt);
> AZ(strchr(fmt, '\n'));
> va_start(ap, fmt);
> - if (ctx->vsl != NULL)
> + if (ctx->vsl != NULL) {
> VSLbv(ctx->vsl, SLT_VCL_Error, fmt, ap);
> - else {
> + } else {
> VSB_vprintf(ctx->msg, fmt, ap);
> VSB_putc(ctx->msg, '\n');
> }
> va_end(ap);
> - VRT_handling(ctx, VCL_RET_FAIL);
> + *ctx->handling = VCL_RET_FAIL;
> }
>
> /*--------------------------------------------------------------------
> @@ -772,9 +777,8 @@ VRT_purge(VRT_CTX, VCL_DURATION ttl, VCL_DURATION grace, VCL_DURATION keep)
> CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
>
> if ((ctx->method & (VCL_MET_HIT|VCL_MET_MISS)) == 0) {
> - VSLb(ctx->vsl, SLT_VCL_Error,
> + VRT_fail(ctx,
> "purge can only happen in vcl_hit{} or vcl_miss{}");
> - VRT_handling(ctx, VCL_RET_FAIL);
> return (0);
> }
>
> diff --git a/lib/libvcc/vcc_action.c b/lib/libvcc/vcc_action.c
> index ded906870..02d323a14 100644
> --- a/lib/libvcc/vcc_action.c
> +++ b/lib/libvcc/vcc_action.c
> @@ -350,7 +350,10 @@ vcc_act_return(struct vcc *tl, struct token *t, struct symbol *sym)
> }
> }
> ERRCHK(tl);
> - Fb(tl, 1, "VRT_handling(ctx, VCL_RET_%s);\n", h);
> + if (hand == VCL_RET_FAIL)
> + Fb(tl, 1, "VRT_fail(ctx, \"Failed from VCL\");\n");
> + else
> + Fb(tl, 1, "VRT_handling(ctx, VCL_RET_%s);\n", h);
> SkipToken(tl, ')');
> SkipToken(tl, ';');
> }
> diff --git a/lib/libvcc/vcc_compile.c b/lib/libvcc/vcc_compile.c
> index 13994eb6b..203f34465 100644
> --- a/lib/libvcc/vcc_compile.c
> +++ b/lib/libvcc/vcc_compile.c
> @@ -318,8 +318,15 @@ EmitInitFini(const struct vcc *tl)
> if (VSB_len(p->event))
> has_event = 1;
> }
> +
> + /* Handle failures from vcl_init */
> + Fc(tl, 0, "\n");
> + Fc(tl, 0, "\tif (*ctx->handling != VCL_RET_OK)\n");
> + Fc(tl, 0, "\t\treturn(1);\n");
> +
> VTAILQ_FOREACH(sy, &tl->sym_objects, sideways) {
> Fc(tl, 0, "\tif (!%s) {\n", sy->rname);
> + Fc(tl, 0, "\t\t*ctx->handling = 0;\n");
> Fc(tl, 0, "\t\tVRT_fail(ctx, "
> "\"Object %s not initialized\");\n" , sy->name);
> Fc(tl, 0, "\t\treturn(1);\n");
> @@ -655,7 +662,12 @@ vcc_CompileSource(struct vcc *tl, struct source *sp)
>
> /* Tie vcl_init/fini in */
> ifp = New_IniFin(tl);
> - VSB_printf(ifp->ini, "\tVGC_function_vcl_init(ctx);");
> + VSB_printf(ifp->ini, "\tVGC_function_vcl_init(ctx);\n");
> + /*
> + * We do not return(1) if this fails, because the failure
> + * could be half way into vcl_init{} so vcl_fini{} must
> + * always be called, also on failure.
> + */
> VSB_printf(ifp->fin, "\t\tVGC_function_vcl_fini(ctx);");
>
> /* Emit method functions */
> _______________________________________________
> varnish-commit mailing list
> varnish-commit at varnish-cache.org
> https://www.varnish-cache.org/lists/mailman/listinfo/varnish-commit
More information about the varnish-commit
mailing list