Navigation Menu

Skip to content

Commit

Permalink
Deref the objcore before switching to synth on error.
Browse files Browse the repository at this point in the history
Also add asserts for the references held in req->objcore and
req->stale_oc.

The test case for #1807 catches this bug after adding the asserts.

Fixes: #2502
  • Loading branch information
mbgrydeland committed Nov 27, 2017
1 parent eecd409 commit cf6c5c6
Showing 1 changed file with 20 additions and 0 deletions.
20 changes: 20 additions & 0 deletions bin/varnishd/cache/cache_req_fsm.c
Expand Up @@ -114,6 +114,7 @@ cnt_deliver(struct worker *wrk, struct req *req)
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
CHECK_OBJ_NOTNULL(req->objcore, OBJCORE_MAGIC);
CHECK_OBJ_NOTNULL(req->objcore->objhead, OBJHEAD_MAGIC);
AZ(req->stale_oc);
AN(req->vcl);

assert(req->objcore->refcnt > 0);
Expand All @@ -123,6 +124,7 @@ cnt_deliver(struct worker *wrk, struct req *req)
HTTP_Setup(req->resp, req->ws, req->vsl, SLT_RespMethod);
if (HTTP_Decode(req->resp,
ObjGetAttr(req->wrk, req->objcore, OA_HEADERS, NULL))) {
(void)HSH_DerefObjCore(wrk, &req->objcore, HSH_RUSH_POLICY);
req->err_code = 500;
req->req_step = R_STP_SYNTH;
return (REQ_FSM_MORE);
Expand Down Expand Up @@ -203,6 +205,9 @@ cnt_vclfail(const struct worker *wrk, struct req *req)
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);

AZ(req->objcore);
AZ(req->stale_oc);

HTTP_Copy(req->http, req->http0);
WS_Reset(req->ws, req->ws_req);
req->err_code = 503;
Expand All @@ -228,6 +233,9 @@ cnt_synth(struct worker *wrk, struct req *req)
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);

AZ(req->objcore);
AZ(req->stale_oc);

wrk->stats->s_synth++;

now = W_TIM_real(wrk);
Expand Down Expand Up @@ -339,6 +347,8 @@ cnt_transmit(struct worker *wrk, struct req *req)
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
CHECK_OBJ_NOTNULL(req->transport, TRANSPORT_MAGIC);
CHECK_OBJ_NOTNULL(req->objcore, OBJCORE_MAGIC);
AZ(req->stale_oc);

/* Grab a ref to the bo if there is one */
boc = HSH_RefBoc(req->objcore);
Expand Down Expand Up @@ -426,6 +436,7 @@ cnt_fetch(struct worker *wrk, struct req *req)
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
CHECK_OBJ_NOTNULL(req->objcore, OBJCORE_MAGIC);
AZ(req->stale_oc);

wrk->stats->s_fetch++;
(void)VRB_Ignore(req);
Expand Down Expand Up @@ -457,6 +468,7 @@ cnt_lookup(struct worker *wrk, struct req *req)
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
AZ(req->objcore);
AZ(req->stale_oc);

AN(req->vcl);

Expand Down Expand Up @@ -586,6 +598,7 @@ cnt_miss(struct worker *wrk, struct req *req)
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
AN(req->vcl);
CHECK_OBJ_NOTNULL(req->objcore, OBJCORE_MAGIC);
CHECK_OBJ_ORNULL(req->stale_oc, OBJCORE_MAGIC);

VCL_miss_method(req->vcl, wrk, req, NULL, NULL);
switch (wrk->handling) {
Expand Down Expand Up @@ -630,6 +643,7 @@ cnt_pass(struct worker *wrk, struct req *req)
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
AN(req->vcl);
AZ(req->objcore);
AZ(req->stale_oc);

VCL_pass_method(req->vcl, wrk, req, NULL, NULL);
switch (wrk->handling) {
Expand Down Expand Up @@ -667,6 +681,8 @@ cnt_pipe(struct worker *wrk, struct req *req)

CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
AZ(req->objcore);
AZ(req->stale_oc);
AN(req->vcl);

wrk->stats->s_pipe++;
Expand Down Expand Up @@ -723,6 +739,8 @@ cnt_restart(struct worker *wrk, struct req *req)

CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
AZ(req->objcore);
AZ(req->stale_oc);

if (++req->restarts > cache_param->max_restarts) {
VSLb(req->vsl, SLT_VCL_Error, "Too many restarts");
Expand Down Expand Up @@ -801,6 +819,7 @@ cnt_recv(struct worker *wrk, struct req *req)
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
AN(req->vcl);
AZ(req->objcore);
AZ(req->stale_oc);
AZ(req->err_code);

AZ(isnan(req->t_first));
Expand Down Expand Up @@ -922,6 +941,7 @@ cnt_purge(struct worker *wrk, struct req *req)
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
AZ(req->objcore);
AZ(req->stale_oc);

AN(req->vcl);

Expand Down

0 comments on commit cf6c5c6

Please sign in to comment.