Skip to content

Commit cd85a2b

Browse files
committed
gracefully handle TSReleaseAsserts in statichit and generator plugins
1 parent aa16a29 commit cd85a2b

File tree

2 files changed

+61
-17
lines changed

2 files changed

+61
-17
lines changed

plugins/experimental/statichit/statichit.cc

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -234,16 +234,25 @@ HeaderFieldStringSet(const StaticHitHttpHeader &http, const char *field_name, in
234234
TSHandleMLocRelease(http.buffer, http.header, field);
235235
}
236236

237-
static void
237+
static TSReturnCode
238238
WriteResponseHeader(StaticHitRequest *trq, TSCont contp, TSHttpStatus status)
239239
{
240240
StaticHitHttpHeader response;
241241

242242
VDEBUG("writing response header");
243243

244-
TSReleaseAssert(TSHttpHdrTypeSet(response.buffer, response.header, TS_HTTP_TYPE_RESPONSE) == TS_SUCCESS);
245-
TSReleaseAssert(TSHttpHdrVersionSet(response.buffer, response.header, TS_HTTP_VERSION(1, 1)) == TS_SUCCESS);
246-
TSReleaseAssert(TSHttpHdrStatusSet(response.buffer, response.header, status) == TS_SUCCESS);
244+
if (TSHttpHdrTypeSet(response.buffer, response.header, TS_HTTP_TYPE_RESPONSE) != TS_SUCCESS) {
245+
VERROR("failed to set type");
246+
return TS_ERROR;
247+
}
248+
if (TSHttpHdrVersionSet(response.buffer, response.header, TS_HTTP_VERSION(1, 1)) != TS_SUCCESS) {
249+
VERROR("failed to set HTTP version");
250+
return TS_ERROR;
251+
}
252+
if (TSHttpHdrStatusSet(response.buffer, response.header, status) != TS_SUCCESS) {
253+
VERROR("failed to set HTTP status");
254+
return TS_ERROR;
255+
}
247256

248257
TSHttpHdrReasonSet(response.buffer, response.header, TSHttpHdrReasonLookup(status), -1);
249258

@@ -275,6 +284,8 @@ WriteResponseHeader(StaticHitRequest *trq, TSCont contp, TSHttpStatus status)
275284
TSVIOReenable(trq->writeio.vio);
276285

277286
TSStatIntIncrement(StatCountBytes, hdrlen);
287+
288+
return TS_SUCCESS;
278289
}
279290

280291
static bool
@@ -496,7 +507,10 @@ StaticHitTxnHook(TSCont contp, TSEvent event, void *edata)
496507
TSMLoc hdr_loc;
497508
const char *method;
498509

499-
TSReleaseAssert(TSHttpTxnCacheLookupStatusGet(arg.txn, &status) == TS_SUCCESS);
510+
if (TSHttpTxnCacheLookupStatusGet(arg.txn, &status) != TS_SUCCESS) {
511+
VERROR("failed to get client request handle");
512+
goto done;
513+
}
500514

501515
if (TSHttpTxnClientReqGet(arg.txn, &bufp, &hdr_loc) != TS_SUCCESS) {
502516
VERROR("Couldn't retrieve client request header");

plugins/generator/generator.cc

Lines changed: 42 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -284,17 +284,26 @@ GeneratorGetRequestHeader(GeneratorHttpHeader &request, const char *field_name,
284284
return default_value;
285285
}
286286

287-
static void
287+
static TSReturnCode
288288
GeneratorWriteResponseHeader(GeneratorRequest *grq, TSCont contp)
289289
{
290290
GeneratorHttpHeader response;
291291

292292
VDEBUG("writing response header");
293293

294-
TSReleaseAssert(TSHttpHdrTypeSet(response.buffer, response.header, TS_HTTP_TYPE_RESPONSE) == TS_SUCCESS);
295-
TSReleaseAssert(TSHttpHdrVersionSet(response.buffer, response.header, TS_HTTP_VERSION(1, 1)) == TS_SUCCESS);
294+
if (TSHttpHdrTypeSet(response.buffer, response.header, TS_HTTP_TYPE_RESPONSE) != TS_SUCCESS) {
295+
VERROR("failed to set type");
296+
return TS_ERROR;
297+
}
298+
if (TSHttpHdrVersionSet(response.buffer, response.header, TS_HTTP_VERSION(1, 1)) != TS_SUCCESS) {
299+
VERROR("failed to set HTTP version");
300+
return TS_ERROR;
301+
}
302+
if (TSHttpHdrStatusSet(response.buffer, response.header, TS_HTTP_STATUS_OK) != TS_SUCCESS) {
303+
VERROR("failed to set HTTP status");
304+
return TS_ERROR;
305+
}
296306

297-
TSReleaseAssert(TSHttpHdrStatusSet(response.buffer, response.header, TS_HTTP_STATUS_OK) == TS_SUCCESS);
298307
TSHttpHdrReasonSet(response.buffer, response.header, TSHttpHdrReasonLookup(TS_HTTP_STATUS_OK), -1);
299308

300309
// Set the Content-Length header.
@@ -320,6 +329,8 @@ GeneratorWriteResponseHeader(GeneratorRequest *grq, TSCont contp)
320329
TSVIOReenable(grq->writeio.vio);
321330

322331
TSStatIntIncrement(StatCountBytes, hdrlen);
332+
333+
return TS_SUCCESS;
323334
}
324335

325336
static bool
@@ -346,8 +357,16 @@ GeneratorParseRequest(GeneratorRequest *grq)
346357
grq->maxage = GeneratorGetRequestHeader(grq->rqheader, "Generator-MaxAge", lengthof("Generator-MaxAge"), grq->maxage);
347358

348359
// Next, parse our parameters out of the URL.
349-
TSReleaseAssert(TSHttpHdrUrlGet(grq->rqheader.buffer, grq->rqheader.header, &url) == TS_SUCCESS);
350-
TSReleaseAssert(path = TSUrlPathGet(grq->rqheader.buffer, url, &pathsz));
360+
if (TSHttpHdrUrlGet(grq->rqheader.buffer, grq->rqheader.header, &url) != TS_SUCCESS) {
361+
VERROR("failed to get URI handle");
362+
return false;
363+
}
364+
365+
path = TSUrlPathGet(grq->rqheader.buffer, url, &pathsz);
366+
if (!path) {
367+
VDEBUG("empty path");
368+
return false;
369+
}
351370

352371
VDEBUG("requested path is %.*s", pathsz, path);
353372

@@ -504,7 +523,10 @@ GeneratorInterceptHook(TSCont contp, TSEvent event, void *edata)
504523
return TS_EVENT_NONE;
505524
}
506525

507-
GeneratorWriteResponseHeader(cdata.grq, contp);
526+
if (GeneratorWriteResponseHeader(cdata.grq, contp) != TS_SUCCESS) {
527+
VERROR("failure writing response");
528+
return TS_EVENT_ERROR;
529+
}
508530
return TS_EVENT_NONE;
509531

510532
case TS_PARSE_CONT:
@@ -580,7 +602,10 @@ GeneratorInterceptHook(TSCont contp, TSEvent event, void *edata)
580602
// Our response delay expired, so write the headers now, which
581603
// will also trigger the read+write event flow.
582604
argument_type cdata = TSContDataGet(contp);
583-
GeneratorWriteResponseHeader(cdata.grq, contp);
605+
if (GeneratorWriteResponseHeader(cdata.grq, contp) != TS_SUCCESS) {
606+
VERROR("failure writing response");
607+
return TS_EVENT_ERROR;
608+
}
584609
return TS_EVENT_NONE;
585610
}
586611

@@ -623,8 +648,14 @@ GeneratorTxnHook(TSCont contp, TSEvent event, void *edata)
623648
TSMLoc url_loc;
624649
TSMLoc hdr_loc;
625650

626-
TSReleaseAssert(TSHttpTxnClientReqGet(arg.txn, &recp, &hdr_loc) == TS_SUCCESS);
627-
TSReleaseAssert(TSHttpHdrUrlGet(recp, hdr_loc, &url_loc) == TS_SUCCESS);
651+
if (TSHttpTxnClientReqGet(arg.txn, &recp, &hdr_loc) != TS_SUCCESS) {
652+
VERROR("failed to get client request handle");
653+
break;
654+
}
655+
if (TSHttpHdrUrlGet(recp, hdr_loc, &url_loc) != TS_SUCCESS) {
656+
VERROR("failed to get URI handle");
657+
break;
658+
}
628659
CheckCacheable(arg.txn, url_loc, recp);
629660
TSHandleMLocRelease(recp, hdr_loc, url_loc);
630661
TSHandleMLocRelease(recp, TS_NULL_MLOC, hdr_loc);
@@ -634,8 +665,7 @@ GeneratorTxnHook(TSCont contp, TSEvent event, void *edata)
634665
case TS_EVENT_HTTP_CACHE_LOOKUP_COMPLETE: {
635666
int status;
636667

637-
TSReleaseAssert(TSHttpTxnCacheLookupStatusGet(arg.txn, &status) == TS_SUCCESS);
638-
if (status != TS_CACHE_LOOKUP_HIT_FRESH) {
668+
if (TSHttpTxnCacheLookupStatusGet(arg.txn, &status) == TS_SUCCESS && status != TS_CACHE_LOOKUP_HIT_FRESH) {
639669
// This transaction is going to be a cache miss, so intercept it.
640670
VDEBUG("intercepting origin server request for txn=%p", arg.txn);
641671
TSHttpTxnServerIntercept(TSContCreate(GeneratorInterceptHook, TSMutexCreate()), arg.txn);

0 commit comments

Comments
 (0)