diff --git a/lib/core-net/close.c b/lib/core-net/close.c index 1bed39d4b..1a4e0f7f7 100644 --- a/lib/core-net/close.c +++ b/lib/core-net/close.c @@ -340,7 +340,7 @@ lws_addrinfo_clean(struct lws *wsi) #endif } -/* requires cx lock */ +/* requires cx and pt lock */ void __lws_close_free_wsi(struct lws *wsi, enum lws_close_status reason, diff --git a/lib/core-net/wsi-timeout.c b/lib/core-net/wsi-timeout.c index d041947fc..bbaed54c8 100644 --- a/lib/core-net/wsi-timeout.c +++ b/lib/core-net/wsi-timeout.c @@ -206,8 +206,14 @@ lws_validity_cb(lws_sorted_usec_list_t *sul) if (wsi->validity_hup) { lwsl_wsi_info(wsi, "validity too old"); + struct lws_context_per_thread *pt = &wsi->a.context->pt[(int)wsi->tsi]; + + lws_context_lock(wsi->a.context, __func__); + lws_pt_lock(pt, __func__); __lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS, "validity timeout"); + lws_pt_unlock(pt); + lws_context_unlock(wsi->a.context); return; }