Use wStream in pf_client_receive_channel_data_hook

This commit is contained in:
Armin Novak 2021-09-07 14:01:46 +02:00 committed by akallabeth
parent c9effaa6e8
commit 3afd147bc0
1 changed files with 26 additions and 25 deletions

View File

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