diff --git a/channels/drdynvc/client/drdynvc_main.c b/channels/drdynvc/client/drdynvc_main.c index 5232cbb05..5219efdf1 100644 --- a/channels/drdynvc/client/drdynvc_main.c +++ b/channels/drdynvc/client/drdynvc_main.c @@ -421,7 +421,8 @@ static void drdynvc_process_terminate(rdpSvcPlugin* plugin) if (drdynvc->channel_mgr) dvcman_free(drdynvc->channel_mgr); - svc_plugin_terminate(plugin); + svc_plugin_terminate(plugin); + free(drdynvc); } diff --git a/channels/drdynvc/client/dvcman.c b/channels/drdynvc/client/dvcman.c index 2f63ad5d8..5e736e8e9 100644 --- a/channels/drdynvc/client/dvcman.c +++ b/channels/drdynvc/client/dvcman.c @@ -466,11 +466,11 @@ int dvcman_receive_channel_data_first(IWTSVirtualChannelManager* pChannelMgr, UI return 0; } -int dvcman_receive_channel_data(IWTSVirtualChannelManager* pChannelMgr, UINT32 ChannelId, wStream *data) +int dvcman_receive_channel_data(IWTSVirtualChannelManager* pChannelMgr, UINT32 ChannelId, wStream* data) { int error = 0; DVCMAN_CHANNEL* channel; - UINT32 data_size = Stream_GetRemainingLength(data); + UINT32 dataSize = Stream_GetRemainingLength(data); channel = (DVCMAN_CHANNEL*) dvcman_find_channel_by_id(pChannelMgr, ChannelId); @@ -483,7 +483,7 @@ int dvcman_receive_channel_data(IWTSVirtualChannelManager* pChannelMgr, UINT32 C if (channel->dvc_data) { /* Fragmented data */ - if (Stream_GetPosition(channel->dvc_data) + data_size > (UINT32) Stream_Capacity(channel->dvc_data)) + if (Stream_GetPosition(channel->dvc_data) + dataSize > (UINT32) Stream_Capacity(channel->dvc_data)) { DEBUG_WARN("data exceeding declared length!"); Stream_Release(channel->dvc_data); @@ -491,10 +491,12 @@ int dvcman_receive_channel_data(IWTSVirtualChannelManager* pChannelMgr, UINT32 C return 1; } - Stream_Write(channel->dvc_data, Stream_Pointer(data), data_size); + Stream_Write(channel->dvc_data, Stream_Pointer(data), dataSize); if (((size_t) Stream_GetPosition(channel->dvc_data)) >= Stream_Capacity(channel->dvc_data)) { + Stream_SealLength(channel->dvc_data); + Stream_SetPosition(channel->dvc_data, 0); error = channel->channel_callback->OnDataReceived(channel->channel_callback, channel->dvc_data); Stream_Release(channel->dvc_data); channel->dvc_data = NULL; diff --git a/channels/rdpgfx/client/rdpgfx_main.c b/channels/rdpgfx/client/rdpgfx_main.c index 00bdf21a3..2b50e9ce8 100644 --- a/channels/rdpgfx/client/rdpgfx_main.c +++ b/channels/rdpgfx/client/rdpgfx_main.c @@ -750,9 +750,7 @@ static int rdpgfx_on_data_received(IWTSVirtualChannelCallback* pChannelCallback, RDPGFX_CHANNEL_CALLBACK* callback = (RDPGFX_CHANNEL_CALLBACK*) pChannelCallback; RDPGFX_PLUGIN* gfx = (RDPGFX_PLUGIN*) callback->plugin; - status = zgfx_decompress(gfx->zgfx, Stream_Buffer(data), Stream_Length(data), &pDstData, &DstSize, 0); - - Stream_Release(data); + status = zgfx_decompress(gfx->zgfx, Stream_Pointer(data), Stream_GetRemainingLength(data), &pDstData, &DstSize, 0); if (status < 0) { diff --git a/libfreerdp/utils/svc_plugin.c b/libfreerdp/utils/svc_plugin.c index cb1df331d..578c91562 100644 --- a/libfreerdp/utils/svc_plugin.c +++ b/libfreerdp/utils/svc_plugin.c @@ -102,10 +102,11 @@ static void svc_plugin_process_received(rdpSvcPlugin* plugin, void* pData, UINT3 if (dataFlags & CHANNEL_FLAG_FIRST) { - if (plugin->data_in != NULL) + if (plugin->data_in) Stream_Release(plugin->data_in); plugin->data_in = StreamPool_Take(plugin->pool, totalLength); + Stream_AddRef(plugin->data_in); } s = plugin->data_in; @@ -122,7 +123,6 @@ static void svc_plugin_process_received(rdpSvcPlugin* plugin, void* pData, UINT3 plugin->data_in = NULL; Stream_SealLength(s); Stream_SetPosition(s, 0); - Stream_AddRef(s); MessageQueue_Post(plugin->MsgPipe->In, NULL, 0, (void*) s, NULL); }