diff --git a/lib/core-net/close.c b/lib/core-net/close.c index ebd3fe94c..0339ed402 100644 --- a/lib/core-net/close.c +++ b/lib/core-net/close.c @@ -303,7 +303,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 44da7c44d..b4ef90f54 100644 --- a/lib/core-net/wsi-timeout.c +++ b/lib/core-net/wsi-timeout.c @@ -302,9 +302,16 @@ lws_validity_cb(lws_sorted_usec_list_t *sul) /* one of either the ping or hangup validity threshold was crossed */ if (wsi->validity_hup) { + struct lws_context_per_thread *pt = &wsi->a.context->pt[(int)wsi->tsi]; + lwsl_info("%s: %s: validity too old\n", __func__, lws_wsi_tag(wsi)); + + 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; }