channels/drdynvc: fix fragmented packets

This commit is contained in:
Marc-André Moreau
2014-06-11 14:31:46 -04:00
parent 3c5b8b3d57
commit 0901938590
4 changed files with 11 additions and 10 deletions

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -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)
{

View File

@@ -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);
}