From 2f5e5359f60c26a2de244cd6d9f7957b039cd121 Mon Sep 17 00:00:00 2001 From: akallabeth Date: Tue, 12 May 2020 10:54:07 +0200 Subject: [PATCH] Destroy channel listeners on terminate --- channels/audin/client/audin_main.c | 9 ++++++++- channels/disp/client/disp_main.c | 11 +++++++++-- channels/echo/client/echo_main.c | 11 ++++++++--- channels/geometry/client/geometry_main.c | 13 ++++++++++--- channels/rdpei/client/rdpei_main.c | 9 +++++++-- channels/rdpgfx/client/rdpgfx_main.c | 9 +++++++-- channels/rdpsnd/client/rdpsnd_main.c | 9 +++++++-- channels/urbdrc/client/urbdrc_main.c | 7 ++++++- channels/video/client/video_main.c | 17 +++++++++++++++-- 9 files changed, 77 insertions(+), 18 deletions(-) diff --git a/channels/audin/client/audin_main.c b/channels/audin/client/audin_main.c index 1b14fd3b7..d843b21f5 100644 --- a/channels/audin/client/audin_main.c +++ b/channels/audin/client/audin_main.c @@ -687,7 +687,7 @@ static UINT audin_plugin_initialize(IWTSPlugin* pPlugin, IWTSVirtualChannelManag audin->listener_callback->plugin = pPlugin; audin->listener_callback->channel_mgr = pChannelMgr; return pChannelMgr->CreateListener(pChannelMgr, "AUDIO_INPUT", 0, - (IWTSListenerCallback*)audin->listener_callback, NULL); + &audin->listener_callback->iface, NULL); } /** @@ -704,6 +704,13 @@ static UINT audin_plugin_terminated(IWTSPlugin* pPlugin) return CHANNEL_RC_BAD_CHANNEL_HANDLE; WLog_Print(audin->log, WLOG_TRACE, "..."); + + if (audin->listener_callback) + { + IWTSVirtualChannelManager* mgr = audin->listener_callback->channel_mgr; + if (mgr) + IFCALL(mgr->DestroyListener, mgr, &audin->iface); + } audio_formats_free(audin->fixed_format, 1); if (audin->device) diff --git a/channels/disp/client/disp_main.c b/channels/disp/client/disp_main.c index d3e9a22cf..58a902a30 100644 --- a/channels/disp/client/disp_main.c +++ b/channels/disp/client/disp_main.c @@ -308,8 +308,7 @@ static UINT disp_plugin_initialize(IWTSPlugin* pPlugin, IWTSVirtualChannelManage disp->listener_callback->plugin = pPlugin; disp->listener_callback->channel_mgr = pChannelMgr; status = pChannelMgr->CreateListener(pChannelMgr, DISP_DVC_CHANNEL_NAME, 0, - (IWTSListenerCallback*)disp->listener_callback, - &(disp->listener)); + &disp->listener_callback->iface, &(disp->listener)); disp->listener->pInterface = disp->iface.pInterface; return status; } @@ -322,6 +321,14 @@ static UINT disp_plugin_initialize(IWTSPlugin* pPlugin, IWTSVirtualChannelManage static UINT disp_plugin_terminated(IWTSPlugin* pPlugin) { DISP_PLUGIN* disp = (DISP_PLUGIN*)pPlugin; + + if (disp && disp->listener_callback) + { + IWTSVirtualChannelManager* mgr = disp->listener_callback->channel_mgr; + if (mgr) + IFCALL(mgr->DestroyListener, mgr, &disp->iface); + } + free(disp->listener_callback); free(disp->iface.pInterface); free(pPlugin); diff --git a/channels/echo/client/echo_main.c b/channels/echo/client/echo_main.c index e830122a7..83f27f94d 100644 --- a/channels/echo/client/echo_main.c +++ b/channels/echo/client/echo_main.c @@ -142,8 +142,8 @@ static UINT echo_plugin_initialize(IWTSPlugin* pPlugin, IWTSVirtualChannelManage echo->listener_callback->plugin = pPlugin; echo->listener_callback->channel_mgr = pChannelMgr; - return pChannelMgr->CreateListener(pChannelMgr, "ECHO", 0, - (IWTSListenerCallback*)echo->listener_callback, NULL); + return pChannelMgr->CreateListener(pChannelMgr, "ECHO", 0, &echo->listener_callback->iface, + NULL); } /** @@ -154,7 +154,12 @@ static UINT echo_plugin_initialize(IWTSPlugin* pPlugin, IWTSVirtualChannelManage static UINT echo_plugin_terminated(IWTSPlugin* pPlugin) { ECHO_PLUGIN* echo = (ECHO_PLUGIN*)pPlugin; - + if (echo && echo->listener_callback) + { + IWTSVirtualChannelManager* mgr = echo->listener_callback->channel_mgr; + if (mgr) + IFCALL(mgr->DestroyListener, mgr, &echo->iface); + } free(echo); return CHANNEL_RC_OK; diff --git a/channels/geometry/client/geometry_main.c b/channels/geometry/client/geometry_main.c index f08b76cf1..d3373e0c4 100644 --- a/channels/geometry/client/geometry_main.c +++ b/channels/geometry/client/geometry_main.c @@ -410,9 +410,9 @@ static UINT geometry_plugin_initialize(IWTSPlugin* pPlugin, IWTSVirtualChannelMa geometry->listener_callback->iface.OnNewChannelConnection = geometry_on_new_channel_connection; geometry->listener_callback->plugin = pPlugin; geometry->listener_callback->channel_mgr = pChannelMgr; - status = pChannelMgr->CreateListener(pChannelMgr, GEOMETRY_DVC_CHANNEL_NAME, 0, - (IWTSListenerCallback*)geometry->listener_callback, - &(geometry->listener)); + status = + pChannelMgr->CreateListener(pChannelMgr, GEOMETRY_DVC_CHANNEL_NAME, 0, + &geometry->listener_callback->iface, &(geometry->listener)); geometry->listener->pInterface = geometry->iface.pInterface; return status; } @@ -427,6 +427,13 @@ static UINT geometry_plugin_terminated(IWTSPlugin* pPlugin) GEOMETRY_PLUGIN* geometry = (GEOMETRY_PLUGIN*)pPlugin; GeometryClientContext* context = (GeometryClientContext*)geometry->iface.pInterface; + if (geometry && geometry->listener_callback) + { + IWTSVirtualChannelManager* mgr = geometry->listener_callback->channel_mgr; + if (mgr) + IFCALL(mgr->DestroyListener, mgr, &geometry->iface); + } + if (context) HashTable_Free(context->geometries); diff --git a/channels/rdpei/client/rdpei_main.c b/channels/rdpei/client/rdpei_main.c index 7dd65211d..82f56aec1 100644 --- a/channels/rdpei/client/rdpei_main.c +++ b/channels/rdpei/client/rdpei_main.c @@ -571,8 +571,7 @@ static UINT rdpei_plugin_initialize(IWTSPlugin* pPlugin, IWTSVirtualChannelManag rdpei->listener_callback->channel_mgr = pChannelMgr; if ((error = pChannelMgr->CreateListener(pChannelMgr, RDPEI_DVC_CHANNEL_NAME, 0, - (IWTSListenerCallback*)rdpei->listener_callback, - &(rdpei->listener)))) + &rdpei->listener_callback->iface, &(rdpei->listener)))) { WLog_ERR(TAG, "ChannelMgr->CreateListener failed with error %" PRIu32 "!", error); goto error_out; @@ -598,6 +597,12 @@ static UINT rdpei_plugin_terminated(IWTSPlugin* pPlugin) if (!pPlugin) return ERROR_INVALID_PARAMETER; + if (rdpei && rdpei->listener_callback) + { + IWTSVirtualChannelManager* mgr = rdpei->listener_callback->channel_mgr; + if (mgr) + IFCALL(mgr->DestroyListener, mgr, &rdpei->iface); + } free(rdpei->listener_callback); free(rdpei->context); free(rdpei); diff --git a/channels/rdpgfx/client/rdpgfx_main.c b/channels/rdpgfx/client/rdpgfx_main.c index 7bc25dba9..e8591a017 100644 --- a/channels/rdpgfx/client/rdpgfx_main.c +++ b/channels/rdpgfx/client/rdpgfx_main.c @@ -1896,8 +1896,7 @@ static UINT rdpgfx_plugin_initialize(IWTSPlugin* pPlugin, IWTSVirtualChannelMana gfx->listener_callback->plugin = pPlugin; gfx->listener_callback->channel_mgr = pChannelMgr; error = pChannelMgr->CreateListener(pChannelMgr, RDPGFX_DVC_CHANNEL_NAME, 0, - (IWTSListenerCallback*)gfx->listener_callback, - &(gfx->listener)); + &gfx->listener_callback->iface, &(gfx->listener)); gfx->listener->pInterface = gfx->iface.pInterface; DEBUG_RDPGFX(gfx->log, "Initialize"); return error; @@ -1913,6 +1912,12 @@ static UINT rdpgfx_plugin_terminated(IWTSPlugin* pPlugin) RDPGFX_PLUGIN* gfx = (RDPGFX_PLUGIN*)pPlugin; RdpgfxClientContext* context = (RdpgfxClientContext*)gfx->iface.pInterface; DEBUG_RDPGFX(gfx->log, "Terminated"); + if (gfx && gfx->listener_callback) + { + IWTSVirtualChannelManager* mgr = gfx->listener_callback->channel_mgr; + if (mgr) + IFCALL(mgr->DestroyListener, mgr, &gfx->iface); + } rdpgfx_client_context_free(context); return CHANNEL_RC_OK; } diff --git a/channels/rdpsnd/client/rdpsnd_main.c b/channels/rdpsnd/client/rdpsnd_main.c index 2526ec55d..3f400a55f 100644 --- a/channels/rdpsnd/client/rdpsnd_main.c +++ b/channels/rdpsnd/client/rdpsnd_main.c @@ -1541,8 +1541,7 @@ static UINT rdpsnd_plugin_initialize(IWTSPlugin* pPlugin, IWTSVirtualChannelMana rdpsnd->listener_callback->plugin = pPlugin; rdpsnd->listener_callback->channel_mgr = pChannelMgr; status = pChannelMgr->CreateListener(pChannelMgr, RDPSND_DVC_CHANNEL_NAME, 0, - (IWTSListenerCallback*)rdpsnd->listener_callback, - &(rdpsnd->listener)); + &rdpsnd->listener_callback->iface, &(rdpsnd->listener)); rdpsnd->listener->pInterface = rdpsnd->iface.pInterface; return rdpsnd_virtual_channel_event_initialized(rdpsnd); } @@ -1557,6 +1556,12 @@ static UINT rdpsnd_plugin_terminated(IWTSPlugin* pPlugin) rdpsndPlugin* rdpsnd = (rdpsndPlugin*)pPlugin; if (rdpsnd) { + if (rdpsnd->listener_callback) + { + IWTSVirtualChannelManager* mgr = rdpsnd->listener_callback->channel_mgr; + if (mgr) + IFCALL(mgr->DestroyListener, mgr, &rdpsnd->iface); + } free(rdpsnd->listener_callback); free(rdpsnd->iface.pInterface); } diff --git a/channels/urbdrc/client/urbdrc_main.c b/channels/urbdrc/client/urbdrc_main.c index 6dbdc5a41..b6449cd47 100644 --- a/channels/urbdrc/client/urbdrc_main.c +++ b/channels/urbdrc/client/urbdrc_main.c @@ -709,7 +709,12 @@ static UINT urbdrc_plugin_terminated(IWTSPlugin* pPlugin) if (!urbdrc) return ERROR_INVALID_DATA; - + if (urbdrc->listener_callback) + { + IWTSVirtualChannelManager* mgr = urbdrc->listener_callback->channel_mgr; + if (mgr) + IFCALL(mgr->DestroyListener, mgr, &urbdrc->iface); + } udevman = urbdrc->udevman; if (udevman) diff --git a/channels/video/client/video_main.c b/channels/video/client/video_main.c index 1efadb399..3fecb63a7 100644 --- a/channels/video/client/video_main.c +++ b/channels/video/client/video_main.c @@ -1048,7 +1048,7 @@ static UINT video_plugin_initialize(IWTSPlugin* plugin, IWTSVirtualChannelManage callback->channel_mgr = channelMgr; status = channelMgr->CreateListener(channelMgr, VIDEO_CONTROL_DVC_CHANNEL_NAME, 0, - (IWTSListenerCallback*)callback, &(video->controlListener)); + &callback->iface, &(video->controlListener)); if (status != CHANNEL_RC_OK) return status; @@ -1067,7 +1067,7 @@ static UINT video_plugin_initialize(IWTSPlugin* plugin, IWTSVirtualChannelManage callback->channel_mgr = channelMgr; status = channelMgr->CreateListener(channelMgr, VIDEO_DATA_DVC_CHANNEL_NAME, 0, - (IWTSListenerCallback*)callback, &(video->dataListener)); + &callback->iface, &(video->dataListener)); if (status == CHANNEL_RC_OK) video->dataListener->pInterface = video->wtsPlugin.pInterface; @@ -1084,6 +1084,19 @@ static UINT video_plugin_terminated(IWTSPlugin* pPlugin) { VIDEO_PLUGIN* video = (VIDEO_PLUGIN*)pPlugin; + if (video->control_callback) + { + IWTSVirtualChannelManager* mgr = video->control_callback->channel_mgr; + if (mgr) + IFCALL(mgr->DestroyListener, mgr, &video->control_callback->iface); + } + if (video->data_callback) + { + IWTSVirtualChannelManager* mgr = video->data_callback->channel_mgr; + if (mgr) + IFCALL(mgr->DestroyListener, mgr, &video->data_callback->iface); + } + if (video->context) VideoClientContextPriv_free(video->context->priv);