[master] 197b72ab2 Generalize the VDP API
Nils Goroll
nils.goroll at uplex.de
Mon Sep 2 14:02:05 UTC 2024
commit 197b72ab24bcd604602be573a130d0dcddb5fa92
Author: Nils Goroll <nils.goroll at uplex.de>
Date: Wed Dec 27 12:39:47 2023 +0100
Generalize the VDP API
This commit is to prepare use of the VDP API also for the backend
side to filter bereq.body through bereq.filters by putting all pointers
_intended_ to be used by a VDP init function into vdp_ctx.
For background, see #4035
diff --git a/bin/varnishd/cache/cache_deliver_proc.c b/bin/varnishd/cache/cache_deliver_proc.c
index 04ff3bbec..db658d17b 100644
--- a/bin/varnishd/cache/cache_deliver_proc.c
+++ b/bin/varnishd/cache/cache_deliver_proc.c
@@ -71,18 +71,35 @@ VDP_Fini(const struct vdp_ctx *vdc)
void
VDP_Init(struct vdp_ctx *vdc, struct worker *wrk, struct vsl_log *vsl,
- struct req *req)
+ struct req *req, struct busyobj *bo, intmax_t *clen)
{
AN(vdc);
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
AN(vsl);
- CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
+
+ CHECK_OBJ_ORNULL(req, REQ_MAGIC);
+ CHECK_OBJ_ORNULL(bo, BUSYOBJ_MAGIC);
+ AN(clen);
+
+ assert((req ? 1 : 0) ^ (bo ? 1 : 0));
+
+ AN(clen);
+ assert(*clen >= -1);
INIT_OBJ(vdc, VDP_CTX_MAGIC);
VTAILQ_INIT(&vdc->vdp);
vdc->wrk = wrk;
vdc->vsl = vsl;
- vdc->req = req;
+ vdc->clen = clen;
+
+ if (req != NULL) {
+ vdc->oc = req->objcore;
+ vdc->hp = req->resp;
+ }
+ else {
+ vdc->oc = bo->bereq_body;
+ vdc->hp = bo->bereq;
+ }
}
/* VDP_bytes
@@ -152,6 +169,10 @@ VDP_Push(VRT_CTX, struct vdp_ctx *vdc, struct ws *ws, const struct vdp *vdp,
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(vdc, VDP_CTX_MAGIC);
+ CHECK_OBJ_ORNULL(vdc->oc, OBJCORE_MAGIC);
+ CHECK_OBJ_NOTNULL(vdc->hp, HTTP_MAGIC);
+ AN(vdc->clen);
+ assert(*vdc->clen >= -1);
AN(ws);
AN(vdp);
AN(vdp->name);
@@ -175,10 +196,9 @@ VDP_Push(VRT_CTX, struct vdp_ctx *vdc, struct ws *ws, const struct vdp *vdp,
vdc->nxt = VTAILQ_FIRST(&vdc->vdp);
AZ(vdc->retval);
- if (vdpe->vdp->init != NULL) {
- vdc->retval = vdpe->vdp->init(ctx, vdc, &vdpe->priv,
- vdpe == vdc->nxt ? vdc->req->objcore : NULL);
- }
+ if (vdpe->vdp->init != NULL)
+ vdc->retval = vdpe->vdp->init(ctx, vdc, &vdpe->priv);
+ vdc->oc = NULL;
if (vdc->retval > 0) {
VTAILQ_REMOVE(&vdc->vdp, vdpe, list);
@@ -254,7 +274,9 @@ VDP_DeliverObj(struct vdp_ctx *vdc, struct objcore *oc)
CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
CHECK_OBJ_NOTNULL(vdc->wrk, WORKER_MAGIC);
AN(vdc->vsl);
- vdc->req = NULL;
+ AZ(vdc->oc);
+ vdc->hp = NULL;
+ vdc->clen = NULL;
final = oc->flags & (OC_F_PRIVATE | OC_F_HFM | OC_F_HFP) ? 1 : 0;
r = ObjIterate(vdc->wrk, oc, vdc, vdp_objiterate, final);
if (r < 0)
diff --git a/bin/varnishd/cache/cache_esi_deliver.c b/bin/varnishd/cache/cache_esi_deliver.c
index 23cdfe242..ba6b0412d 100644
--- a/bin/varnishd/cache/cache_esi_deliver.c
+++ b/bin/varnishd/cache/cache_esi_deliver.c
@@ -261,35 +261,41 @@ ved_decode_len(struct vsl_log *vsl, const uint8_t **pp)
*/
static int v_matchproto_(vdp_init_f)
-ved_vdp_esi_init(VRT_CTX, struct vdp_ctx *vdc, void **priv, struct objcore *oc)
+ved_vdp_esi_init(VRT_CTX, struct vdp_ctx *vdc, void **priv)
{
struct ecx *ecx;
- struct req *req;
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
+ CHECK_OBJ_ORNULL(ctx->req, REQ_MAGIC);
CHECK_OBJ_NOTNULL(vdc, VDP_CTX_MAGIC);
- CHECK_OBJ_ORNULL(oc, OBJCORE_MAGIC);
- if (oc == NULL || !ObjHasAttr(vdc->wrk, oc, OA_ESIDATA))
- return (1);
-
- req = vdc->req;
- CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
+ CHECK_OBJ_ORNULL(vdc->oc, OBJCORE_MAGIC);
+ CHECK_OBJ_NOTNULL(vdc->hp, HTTP_MAGIC);
+ AN(vdc->clen);
AN(priv);
+
AZ(*priv);
+ if (vdc->oc == NULL || !ObjHasAttr(vdc->wrk, vdc->oc, OA_ESIDATA))
+ return (1);
+
+ if (ctx->req == NULL) {
+ VSLb(vdc->vsl, SLT_Error,
+ "esi can only be used on the client side");
+ return (1);
+ }
ALLOC_OBJ(ecx, ECX_MAGIC);
AN(ecx);
assert(sizeof gzip_hdr == 10);
- ecx->preq = req;
+ ecx->preq = ctx->req;
*priv = ecx;
- RFC2616_Weaken_Etag(req->resp);
-
- req->res_mode |= RES_ESI;
- if (req->resp_len != 0)
- req->resp_len = -1;
- if (req->esi_level > 0) {
- assert(req->transport == &VED_transport);
- CAST_OBJ_NOTNULL(ecx->pecx, req->transport_priv, ECX_MAGIC);
+ RFC2616_Weaken_Etag(vdc->hp);
+
+ ctx->req->res_mode |= RES_ESI;
+ if (*vdc->clen != 0)
+ *vdc->clen = -1;
+ if (ctx->req->esi_level > 0) {
+ assert(ctx->req->transport == &VED_transport);
+ CAST_OBJ_NOTNULL(ecx->pecx, ctx->req->transport_priv, ECX_MAGIC);
if (!ecx->pecx->isgzip)
ecx->pecx = NULL;
}
@@ -604,18 +610,16 @@ struct ved_foo {
};
static int v_matchproto_(vdp_init_f)
-ved_gzgz_init(VRT_CTX, struct vdp_ctx *vdc, void **priv, struct objcore *oc)
+ved_gzgz_init(VRT_CTX, struct vdp_ctx *vdc, void **priv)
{
ssize_t l;
const char *p;
struct ved_foo *foo;
- struct req *req;
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(vdc, VDP_CTX_MAGIC);
- (void)oc;
- req = vdc->req;
- CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
+ AN(priv);
+
CAST_OBJ_NOTNULL(foo, *priv, VED_FOO_MAGIC);
CHECK_OBJ_NOTNULL(foo->objcore, OBJCORE_MAGIC);
@@ -925,7 +929,6 @@ ved_deliver(struct req *req, struct boc *boc, int wantbody)
foo->ecx = ecx;
foo->objcore = req->objcore;
i = VDP_Push(ctx, req->vdc, req->ws, &ved_gzgz, foo);
-
} else if (ecx->isgzip && !i) {
/* Non-Gzip'ed include in gzip'ed parent */
i = VDP_Push(ctx, req->vdc, req->ws, &ved_pretend_gz, ecx);
diff --git a/bin/varnishd/cache/cache_filter.h b/bin/varnishd/cache/cache_filter.h
index d06540092..329ab9982 100644
--- a/bin/varnishd/cache/cache_filter.h
+++ b/bin/varnishd/cache/cache_filter.h
@@ -90,7 +90,7 @@ struct vfp_ctx {
struct http *req;
struct http *resp;
struct worker *wrk;
- struct objcore *oc;
+ struct objcore *oc; // Only first filter, if at all
struct vfp_entry_s vfp;
struct vfp_entry *vfp_nxt;
@@ -112,8 +112,8 @@ enum vdp_action {
VDP_END, /* Last buffer or after, implies VDP_FLUSH */
};
-typedef int vdp_init_f(VRT_CTX, struct vdp_ctx *, void **priv,
- struct objcore *);
+
+typedef int vdp_init_f(VRT_CTX, struct vdp_ctx *, void **priv);
/*
* Return value:
* negative: Error - abandon delivery
@@ -155,7 +155,11 @@ struct vdp_ctx {
struct vdp_entry *nxt;
struct worker *wrk;
struct vsl_log *vsl;
- struct req *req;
+ // NULL'ed after the first filter has been pushed
+ struct objcore *oc;
+ // NULL'ed for delivery
+ struct http *hp;
+ intmax_t *clen;
};
int VDP_bytes(struct vdp_ctx *, enum vdp_action act, const void *, ssize_t);
diff --git a/bin/varnishd/cache/cache_gzip.c b/bin/varnishd/cache/cache_gzip.c
index 472ac2e5b..a7402ca56 100644
--- a/bin/varnishd/cache/cache_gzip.c
+++ b/bin/varnishd/cache/cache_gzip.c
@@ -288,11 +288,10 @@ VGZ_Gzip(struct vgz *vg, const void **pptr, ssize_t *plen, enum vgz_flag flags)
*/
static int v_matchproto_(vdp_init_f)
-vdp_gunzip_init(VRT_CTX, struct vdp_ctx *vdc, void **priv, struct objcore *oc)
+vdp_gunzip_init(VRT_CTX, struct vdp_ctx *vdc, void **priv)
{
struct vgz *vg;
struct boc *boc;
- struct req *req;
enum boc_state_e bos;
const char *p;
ssize_t dl;
@@ -300,9 +299,10 @@ vdp_gunzip_init(VRT_CTX, struct vdp_ctx *vdc, void **priv, struct objcore *oc)
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(vdc, VDP_CTX_MAGIC);
- CHECK_OBJ_ORNULL(oc, OBJCORE_MAGIC);
- req = vdc->req;
- CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
+ CHECK_OBJ_ORNULL(vdc->oc, OBJCORE_MAGIC);
+ CHECK_OBJ_NOTNULL(vdc->hp, HTTP_MAGIC);
+ AN(vdc->clen);
+ AN(priv);
vg = VGZ_NewGunzip(vdc->vsl, "U D -");
AN(vg);
@@ -314,27 +314,27 @@ vdp_gunzip_init(VRT_CTX, struct vdp_ctx *vdc, void **priv, struct objcore *oc)
VGZ_Obuf(vg, vg->m_buf, vg->m_sz);
*priv = vg;
- http_Unset(req->resp, H_Content_Encoding);
+ http_Unset(vdc->hp, H_Content_Encoding);
- req->resp_len = -1;
+ *vdc->clen = -1;
- if (oc == NULL)
+ if (vdc->oc == NULL)
return (0);
- boc = HSH_RefBoc(oc);
+ boc = HSH_RefBoc(vdc->oc);
if (boc != NULL) {
CHECK_OBJ(boc, BOC_MAGIC);
bos = boc->state;
- HSH_DerefBoc(vdc->wrk, oc);
+ HSH_DerefBoc(vdc->wrk, vdc->oc);
if (bos < BOS_FINISHED)
return (0); /* OA_GZIPBITS is not stable yet */
}
- p = ObjGetAttr(vdc->wrk, oc, OA_GZIPBITS, &dl);
+ p = ObjGetAttr(vdc->wrk, vdc->oc, OA_GZIPBITS, &dl);
if (p != NULL && dl == 32) {
u = vbe64dec(p + 24);
if (u != 0)
- req->resp_len = u;
+ *vdc->clen = u;
}
return (0);
}
diff --git a/bin/varnishd/cache/cache_range.c b/bin/varnishd/cache/cache_range.c
index d7398f33f..a9a86abc2 100644
--- a/bin/varnishd/cache/cache_range.c
+++ b/bin/varnishd/cache/cache_range.c
@@ -196,33 +196,40 @@ vrg_ifrange(struct req *req)
}
static int v_matchproto_(vdp_init_f)
-vrg_range_init(VRT_CTX, struct vdp_ctx *vdc, void **priv, struct objcore *oc)
+vrg_range_init(VRT_CTX, struct vdp_ctx *vdc, void **priv)
{
const char *err;
- struct req *req;
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
+ CHECK_OBJ_ORNULL(ctx->req, REQ_MAGIC);
CHECK_OBJ_NOTNULL(vdc, VDP_CTX_MAGIC);
- (void)oc;
- req = vdc->req;
- CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
- if (!vrg_ifrange(req)) // rfc7233,l,455,456
+ AN(priv);
+
+ if (ctx->req == NULL) {
+ VSLb(vdc->vsl, SLT_Error,
+ "range can only be used on the client side");
+ return (1);
+ }
+
+ // not using vdc->{hd,cl}, because range needs req anyway for Req_Fail()
+
+ if (!vrg_ifrange(ctx->req)) // rfc7233,l,455,456
return (1);
- err = vrg_dorange(req, priv);
+ err = vrg_dorange(ctx->req, priv);
if (err == NULL)
return (*priv == NULL ? 1 : 0);
VSLb(vdc->vsl, SLT_Debug, "RANGE_FAIL %s", err);
- if (req->resp_len >= 0)
- http_PrintfHeader(req->resp,
+ if (ctx->req->resp_len >= 0)
+ http_PrintfHeader(ctx->req->resp,
"Content-Range: bytes */%jd",
- (intmax_t)req->resp_len);
- http_PutResponse(req->resp, "HTTP/1.1", 416, NULL);
+ (intmax_t)ctx->req->resp_len);
+ http_PutResponse(ctx->req->resp, "HTTP/1.1", 416, NULL);
/*
* XXX: We ought to produce a body explaining things.
* XXX: That really calls for us to hit vcl_synth{}
*/
- req->resp_len = 0;
+ ctx->req->resp_len = 0;
return (1);
}
diff --git a/bin/varnishd/cache/cache_req_fsm.c b/bin/varnishd/cache/cache_req_fsm.c
index 45f66defc..20e4eb13b 100644
--- a/bin/varnishd/cache/cache_req_fsm.c
+++ b/bin/varnishd/cache/cache_req_fsm.c
@@ -462,11 +462,11 @@ cnt_transmit(struct worker *wrk, struct req *req)
sendbody = 1;
}
- VDP_Init(req->vdc, req->wrk, req->vsl, req);
+ VDP_Init(req->vdc, req->wrk, req->vsl, req, NULL, &req->resp_len);
if (req->vdp_filter_list == NULL)
req->vdp_filter_list = resp_Get_Filter_List(req);
if (req->vdp_filter_list == NULL ||
- VCL_StackVDP(req, req->vcl, req->vdp_filter_list)) {
+ VCL_StackVDP(req->vdc, req->vcl, req->vdp_filter_list, req, NULL)) {
VSLb(req->vsl, SLT_Error, "Failure to push processors");
req->doclose = SC_OVERLOAD;
req->acct.resp_bodybytes +=
diff --git a/bin/varnishd/cache/cache_varnishd.h b/bin/varnishd/cache/cache_varnishd.h
index 016516bcd..804961493 100644
--- a/bin/varnishd/cache/cache_varnishd.h
+++ b/bin/varnishd/cache/cache_varnishd.h
@@ -193,7 +193,7 @@ void VDI_Init(void);
/* cache_deliver_proc.c */
void VDP_Fini(const struct vdp_ctx *vdc);
void VDP_Init(struct vdp_ctx *vdc, struct worker *wrk, struct vsl_log *vsl,
- struct req *req);
+ struct req *req, struct busyobj *bo, intmax_t *cl);
uint64_t VDP_Close(struct vdp_ctx *, struct objcore *, struct boc *);
void VDP_Panic(struct vsb *vsb, const struct vdp_ctx *vdc);
int VDP_Push(VRT_CTX, struct vdp_ctx *, struct ws *, const struct vdp *,
@@ -511,7 +511,8 @@ void pan_privs(struct vsb *, const struct vrt_privs *);
/* cache_vrt_filter.c */
int VCL_StackVFP(struct vfp_ctx *, const struct vcl *, const char *);
-int VCL_StackVDP(struct req *, const struct vcl *, const char *);
+int VCL_StackVDP(struct vdp_ctx *vdc, const struct vcl *vcl, const char *fl,
+ struct req *req, struct busyobj *bo);
const char *resp_Get_Filter_List(struct req *req);
void VCL_VRT_Init(void);
diff --git a/bin/varnishd/cache/cache_vrt_filter.c b/bin/varnishd/cache/cache_vrt_filter.c
index e0ca18321..702026a47 100644
--- a/bin/varnishd/cache/cache_vrt_filter.c
+++ b/bin/varnishd/cache/cache_vrt_filter.c
@@ -254,15 +254,28 @@ VCL_StackVFP(struct vfp_ctx *vc, const struct vcl *vcl, const char *fl)
}
int
-VCL_StackVDP(struct req *req, const struct vcl *vcl, const char *fl)
+VCL_StackVDP(struct vdp_ctx *vdc, const struct vcl *vcl, const char *fl,
+ struct req *req, struct busyobj *bo)
{
const struct vfilter *vp;
struct vrt_ctx ctx[1];
+ CHECK_OBJ_NOTNULL(vdc, VDP_CTX_MAGIC);
+ AN(vcl);
AN(fl);
- VSLbs(req->vsl, SLT_Filters, TOSTRAND(fl));
+
+ CHECK_OBJ_ORNULL(req, REQ_MAGIC);
+ CHECK_OBJ_ORNULL(bo, BUSYOBJ_MAGIC);
+
+ assert((req ? 1 : 0) ^ (bo ? 1 : 0));
+
+ VSLbs(vdc->vsl, SLT_Filters, TOSTRAND(fl));
INIT_OBJ(ctx, VRT_CTX_MAGIC);
- VCL_Req2Ctx(ctx, req);
+
+ if (req)
+ VCL_Req2Ctx(ctx, req);
+ else
+ VCL_Bo2Ctx(ctx, bo);
while (1) {
vp = vcl_filter_list_iter(0, &vrt_filters, &vcl->filters, &fl);
@@ -273,7 +286,7 @@ VCL_StackVDP(struct req *req, const struct vcl *vcl, const char *fl)
"Filter '...%s' not found", fl);
return (-1);
}
- if (VDP_Push(ctx, req->vdc, req->ws, vp->vdp, NULL))
+ if (VDP_Push(ctx, vdc, ctx->ws, vp->vdp, NULL))
return (-1);
}
}
diff --git a/bin/varnishd/http2/cache_http2_deliver.c b/bin/varnishd/http2/cache_http2_deliver.c
index cdd356d7d..5de2a7fc4 100644
--- a/bin/varnishd/http2/cache_http2_deliver.c
+++ b/bin/varnishd/http2/cache_http2_deliver.c
@@ -73,7 +73,7 @@ V2D_Init(void)
/**********************************************************************/
static int v_matchproto_(vdp_init_f)
-h2_init(VRT_CTX, struct vdp_ctx *vdc, void **priv, struct objcore *oc)
+h2_init(VRT_CTX, struct vdp_ctx *vdc, void **priv)
{
struct h2_req *r2;
@@ -82,7 +82,6 @@ h2_init(VRT_CTX, struct vdp_ctx *vdc, void **priv, struct objcore *oc)
AN(priv);
CAST_OBJ_NOTNULL(r2, *priv, H2_REQ_MAGIC);
(void)r2;
- (void)oc;
return (0);
}
@@ -348,7 +347,7 @@ h2_deliver(struct req *req, struct boc *boc, int sendbody)
if (sendbody) {
INIT_OBJ(ctx, VRT_CTX_MAGIC);
VCL_Req2Ctx(ctx, req);
- if (!VDP_Push(ctx, req->vdc, req->ws, &h2_vdp, r2))
+ if (! VDP_Push(ctx, req->vdc, req->ws, &h2_vdp, r2))
(void)VDP_DeliverObj(req->vdc, req->objcore);
}
diff --git a/vmod/vmod_debug.c b/vmod/vmod_debug.c
index e78208941..3cf1eb7b7 100644
--- a/vmod/vmod_debug.c
+++ b/vmod/vmod_debug.c
@@ -105,16 +105,21 @@ static const struct vfp xyzzy_vfp_rot13 = {
#define ROT13_BUFSZ 8
static int v_matchproto_(vdp_init_f)
-xyzzy_vdp_rot13_init(VRT_CTX, struct vdp_ctx *vdc, void **priv, struct objcore *oc)
+xyzzy_vdp_rot13_init(VRT_CTX, struct vdp_ctx *vdc, void **priv)
{
- (void)vdc;
- (void)oc;
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
+ CHECK_OBJ_NOTNULL(vdc, VDP_CTX_MAGIC);
+ CHECK_OBJ_ORNULL(vdc->oc, OBJCORE_MAGIC);
+ CHECK_OBJ_NOTNULL(vdc->hp, HTTP_MAGIC);
+ AN(vdc->clen);
+
AN(priv);
+
*priv = malloc(ROT13_BUFSZ);
if (*priv == NULL)
return (-1);
+
return (0);
}
@@ -182,21 +187,18 @@ static const struct vdp xyzzy_vdp_rot13 = {
*/
static int v_matchproto_(vdp_init_f)
-xyzzy_vdp_chunked_init(VRT_CTX, struct vdp_ctx *vdc, void **priv, struct objcore *oc)
+xyzzy_vdp_chunked_init(VRT_CTX, struct vdp_ctx *vdc, void **priv)
{
- struct http *hp;
-
- (void)vdc;
- (void)oc;
- (void)priv;
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(vdc, VDP_CTX_MAGIC);
- CHECK_OBJ_NOTNULL(vdc->req, REQ_MAGIC);
- hp = vdc->req->resp;
- CHECK_OBJ_NOTNULL(hp, HTTP_MAGIC);
- http_Unset(hp, H_Content_Length);
- vdc->req->resp_len = -1;
+ CHECK_OBJ_ORNULL(vdc->oc, OBJCORE_MAGIC);
+ CHECK_OBJ_NOTNULL(vdc->hp, HTTP_MAGIC);
+ AN(vdc->clen);
+ AN(priv);
+
+ http_Unset(vdc->hp, H_Content_Length);
+ *vdc->clen = -1;
return (1);
}
@@ -248,15 +250,18 @@ static const struct vmod_priv_methods priv_pedantic_methods[1] = {{
}};
static int v_matchproto_(vdp_init_f)
-xyzzy_pedantic_init(VRT_CTX, struct vdp_ctx *vdc, void **priv,
- struct objcore *oc)
+xyzzy_pedantic_init(VRT_CTX, struct vdp_ctx *vdc, void **priv)
{
struct vdp_state_s *vdps;
struct vmod_priv *p;
- (void)oc;
-
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
+ CHECK_OBJ_NOTNULL(vdc, VDP_CTX_MAGIC);
+ CHECK_OBJ_ORNULL(vdc->oc, OBJCORE_MAGIC);
+ CHECK_OBJ_NOTNULL(vdc->hp, HTTP_MAGIC);
+ AN(vdc->clen);
+ AN(priv);
+
WS_TASK_ALLOC_OBJ(ctx, vdps, VDP_STATE_MAGIC);
if (vdps == NULL)
return (-1);
@@ -268,7 +273,6 @@ xyzzy_pedantic_init(VRT_CTX, struct vdp_ctx *vdc, void **priv,
p->priv = vdps;
p->methods = priv_pedantic_methods;
- AN(priv);
*priv = vdps;
vdps->state = VDPS_INIT;
More information about the varnish-commit
mailing list