From 7bec222d857b76a7e4268452e7df2a07dd041a1f Mon Sep 17 00:00:00 2001 From: akallabeth Date: Fri, 6 Nov 2020 13:38:47 +0100 Subject: [PATCH] Clean up drdynvc channels porperly locked. (cherry picked from commit 7f1cca78aa9e4cf65cb38c9b741566fbf7dce2d0) --- channels/drdynvc/client/drdynvc_main.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/channels/drdynvc/client/drdynvc_main.c b/channels/drdynvc/client/drdynvc_main.c index f7de630..b2005a9 100644 --- a/channels/drdynvc/client/drdynvc_main.c +++ b/channels/drdynvc/client/drdynvc_main.c @@ -1400,15 +1400,23 @@ static DWORD WINAPI drdynvc_virtual_channel_client_thread(LPVOID arg) /* Disconnect remaining dynamic channels that the server did not. * This is required to properly shut down channels by calling the appropriate * event handlers. */ + size_t count = 0; DVCMAN* drdynvcMgr = (DVCMAN*)drdynvc->channel_mgr; - while (ArrayList_Count(drdynvcMgr->channels) > 0) + do { - IWTSVirtualChannel* channel = - (IWTSVirtualChannel*)ArrayList_GetItem(drdynvcMgr->channels, 0); - const UINT32 ChannelId = drdynvc->channel_mgr->GetChannelId(channel); - dvcman_close_channel(drdynvc->channel_mgr, ChannelId, FALSE); - } + ArrayList_Lock(drdynvcMgr->channels); + count = ArrayList_Count(drdynvcMgr->channels); + if (count > 0) + { + IWTSVirtualChannel* channel = + (IWTSVirtualChannel*)ArrayList_GetItem(drdynvcMgr->channels, 0); + const UINT32 ChannelId = drdynvc->channel_mgr->GetChannelId(channel); + dvcman_close_channel(drdynvc->channel_mgr, ChannelId, FALSE); + count--; + } + ArrayList_Unlock(drdynvcMgr->channels); + } while (count > 0); } if (error && drdynvc->rdpcontext) -- 2.7.4