mirror of https://github.com/FreeRDP/FreeRDP
Use wStream in pf_client_receive_channel_data_hook
This commit is contained in:
parent
c9effaa6e8
commit
3afd147bc0
|
@ -262,7 +262,7 @@ static BOOL pf_client_pre_connect(freerdp* instance)
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL pf_client_receive_channel_data_hook(freerdp* instance, UINT16 channelId,
|
static BOOL pf_client_receive_channel_data_hook(freerdp* instance, UINT16 channelId,
|
||||||
const BYTE* data, size_t size, UINT32 flags,
|
const BYTE* xdata, size_t xsize, UINT32 flags,
|
||||||
size_t totalSize)
|
size_t totalSize)
|
||||||
{
|
{
|
||||||
const char* channel_name = freerdp_channels_get_name_by_id(instance, channelId);
|
const char* channel_name = freerdp_channels_get_name_by_id(instance, channelId);
|
||||||
|
@ -273,7 +273,7 @@ static BOOL pf_client_receive_channel_data_hook(freerdp* instance, UINT16 channe
|
||||||
int pass;
|
int pass;
|
||||||
|
|
||||||
WINPR_ASSERT(instance);
|
WINPR_ASSERT(instance);
|
||||||
WINPR_ASSERT(data || (size == 0));
|
WINPR_ASSERT(xdata || (xsize == 0));
|
||||||
|
|
||||||
pc = (pClientContext*)instance->context;
|
pc = (pClientContext*)instance->context;
|
||||||
WINPR_ASSERT(pc);
|
WINPR_ASSERT(pc);
|
||||||
|
@ -301,8 +301,8 @@ static BOOL pf_client_receive_channel_data_hook(freerdp* instance, UINT16 channe
|
||||||
|
|
||||||
ev.channel_id = channelId;
|
ev.channel_id = channelId;
|
||||||
ev.channel_name = channel_name;
|
ev.channel_name = channel_name;
|
||||||
ev.data = data;
|
ev.data = xdata;
|
||||||
ev.data_len = size;
|
ev.data_len = xsize;
|
||||||
ev.flags = flags;
|
ev.flags = flags;
|
||||||
ev.total_size = totalSize;
|
ev.total_size = totalSize;
|
||||||
|
|
||||||
|
@ -323,52 +323,53 @@ static BOOL pf_client_receive_channel_data_hook(freerdp* instance, UINT16 channe
|
||||||
if ((flags & CHANNEL_FLAG_FIRST) &&
|
if ((flags & CHANNEL_FLAG_FIRST) &&
|
||||||
(strncmp(channel_name, DRDYNVC_SVC_CHANNEL_NAME, CHANNEL_NAME_LEN + 1) == 0))
|
(strncmp(channel_name, DRDYNVC_SVC_CHANNEL_NAME, CHANNEL_NAME_LEN + 1) == 0))
|
||||||
{
|
{
|
||||||
BYTE cmd;
|
BYTE cmd, first;
|
||||||
if (size < 1)
|
wStream s;
|
||||||
|
|
||||||
|
Stream_StaticInit(&s, xdata, xsize);
|
||||||
|
if (Stream_Length(&s) < 1)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
cmd = data[0] >> 4;
|
Stream_Read_UINT8(&s, first);
|
||||||
|
cmd = first >> 4;
|
||||||
|
|
||||||
if (cmd == CREATE_REQUEST_PDU)
|
if (cmd == CREATE_REQUEST_PDU)
|
||||||
{
|
{
|
||||||
proxyChannelDataEventInfo dev;
|
proxyChannelDataEventInfo dev;
|
||||||
size_t len, nameLen;
|
size_t len, nameLen;
|
||||||
const char* name;
|
const char* name;
|
||||||
UINT32 dynChannelId;
|
UINT32 dynChannelId;
|
||||||
BYTE cbId = data[0] & 0x03;
|
BYTE cbId = first & 0x03;
|
||||||
switch (cbId)
|
switch (cbId)
|
||||||
{
|
{
|
||||||
case 0x00:
|
case 0x00:
|
||||||
if (size < 2)
|
if (Stream_GetRemainingLength(&s) < 1)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
dynChannelId = data[1];
|
Stream_Read_UINT8(&s, dynChannelId);
|
||||||
name = (const char*)&data[2];
|
|
||||||
nameLen = size - 2;
|
|
||||||
break;
|
break;
|
||||||
case 0x01:
|
case 0x01:
|
||||||
if (size < 3)
|
if (Stream_GetRemainingLength(&s) < 2)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
dynChannelId = data[2] << 8 | data[1];
|
Stream_Read_UINT16(&s, dynChannelId);
|
||||||
name = (const char*)&data[3];
|
|
||||||
nameLen = size - 3;
|
|
||||||
break;
|
break;
|
||||||
case 0x02:
|
case 0x02:
|
||||||
if (size < 5)
|
if (Stream_GetRemainingLength(&s) < 4)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
dynChannelId = data[4] << 24 | data[3] << 16 | data[2] << 8 | data[1];
|
Stream_Read_UINT32(&s, dynChannelId);
|
||||||
name = (const char*)&data[5];
|
|
||||||
nameLen = size - 5;
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
name = (const char*)Stream_Pointer(&s);
|
||||||
|
nameLen = Stream_GetRemainingLength(&s);
|
||||||
len = strnlen(name, nameLen);
|
len = strnlen(name, nameLen);
|
||||||
if ((len == 0) || (len == nameLen))
|
if ((len == 0) || (len == nameLen))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
dev.channel_id = dynChannelId;
|
dev.channel_id = dynChannelId;
|
||||||
dev.channel_name = name;
|
dev.channel_name = name;
|
||||||
dev.data = data;
|
dev.data = xdata;
|
||||||
dev.data_len = size;
|
dev.data_len = xsize;
|
||||||
dev.flags = flags;
|
dev.flags = flags;
|
||||||
dev.total_size = totalSize;
|
dev.total_size = totalSize;
|
||||||
|
|
||||||
|
@ -386,12 +387,12 @@ static BOOL pf_client_receive_channel_data_hook(freerdp* instance, UINT16 channe
|
||||||
if (server_channel_id == 0)
|
if (server_channel_id == 0)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
return ps->context.peer->SendChannelPacket(ps->context.peer, server_channel_id,
|
return ps->context.peer->SendChannelPacket(ps->context.peer, server_channel_id,
|
||||||
totalSize, flags, data, size);
|
totalSize, flags, xdata, xsize);
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
WINPR_ASSERT(pc->client_receive_channel_data_original);
|
WINPR_ASSERT(pc->client_receive_channel_data_original);
|
||||||
return pc->client_receive_channel_data_original(instance, channelId, data, size, flags,
|
return pc->client_receive_channel_data_original(instance, channelId, xdata, xsize,
|
||||||
totalSize);
|
flags, totalSize);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue