mirror of
https://github.com/morgan9e/FreeRDP
synced 2026-04-15 00:44:19 +09:00
channels/drdynvc: fix fragmented packets
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user