From 9c20d32d33da5f4846f53a481bf797503e81a899 Mon Sep 17 00:00:00 2001 From: Andy Green Date: Fri, 27 Aug 2021 13:08:03 +0100 Subject: [PATCH] validity: take context and pt lock before close --- lib/core-net/close.c | 2 +- lib/core-net/wsi-timeout.c | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) 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; }