--------
- DoS: fix more rare crashes with `requirement` failing (#930, !1696)
[system] requirement "session2_is_empty(s)" failed in session2_transport_event
+ (and others not observed in practice)
Bugfixes
--------
defer_sample_start(&defer_prev_sample_state);
do {
struct qr_task *t = session2_tasklist_del_first(session, false);
- kr_require(worker_task_numrefs(t) > 0);
+ if (kr_fails_assert(worker_task_numrefs(t) > 0))
+ continue; // t has been freed already?
worker_task_finalize(t, status);
worker_task_unref(t);
defer_sample_restart();
static void on_session2_handle_close(uv_handle_t *handle)
{
struct session2 *session = handle->data;
- kr_require(session->transport.type == SESSION2_TRANSPORT_IO &&
+ kr_assert(session->transport.type == SESSION2_TRANSPORT_IO &&
session->transport.io.handle == handle);
io_free(handle);
}
{
struct request_ctx *ctx = task->ctx;
- if (kr_fails_assert(ctx))
+ if (kr_fails_assert(ctx && ctx->task == NULL))
return;
- kr_require(ctx->task == NULL);
request_free(ctx);
/* Update stats */
struct session2 *s = ctx->source.session;
if (s) {
- kr_require(!s->outgoing && session2_waitinglist_is_empty(s));
+ kr_assert(!s->outgoing && session2_waitinglist_is_empty(s));
ctx->source.session = NULL;
session2_tasklist_del(s, task);
}