mirror of
https://github.com/morgan9e/FreeRDP
synced 2026-04-15 00:44:19 +09:00
[core,connection] improve parsing of demand active
Split up parsing, so we don´t have to reread the data.
This commit is contained in:
@@ -1245,33 +1245,32 @@ state_run_t rdp_client_connect_license(rdpRdp* rdp, wStream* s)
|
||||
|
||||
state_run_t rdp_client_connect_demand_active(rdpRdp* rdp, wStream* s)
|
||||
{
|
||||
size_t pos;
|
||||
UINT16 length;
|
||||
UINT16 length = 0;
|
||||
UINT16 channelId = 0;
|
||||
UINT16 pduType = 0;
|
||||
UINT16 pduSource = 0;
|
||||
|
||||
WINPR_ASSERT(rdp);
|
||||
WINPR_ASSERT(s);
|
||||
WINPR_ASSERT(rdp->settings);
|
||||
|
||||
pos = Stream_GetPosition(s);
|
||||
if (!rdp_recv_get_active_header(rdp, s, &channelId, &length))
|
||||
return STATE_RUN_FAILED;
|
||||
|
||||
if (!rdp_recv_demand_active(rdp, s))
|
||||
if (freerdp_shall_disconnect_context(rdp->context))
|
||||
return STATE_RUN_QUIT_SESSION;
|
||||
|
||||
if (!rdp_read_share_control_header(rdp, s, NULL, NULL, &pduType, &pduSource))
|
||||
return STATE_RUN_FAILED;
|
||||
|
||||
switch (pduType)
|
||||
{
|
||||
state_run_t rc;
|
||||
UINT16 channelId;
|
||||
|
||||
Stream_SetPosition(s, pos);
|
||||
if (!rdp_recv_get_active_header(rdp, s, &channelId, &length))
|
||||
return STATE_RUN_FAILED;
|
||||
/* Was Stream_Seek(s, RDP_PACKET_HEADER_MAX_LENGTH);
|
||||
* but the headers aren't always that length,
|
||||
* so that could result in a bad offset.
|
||||
*/
|
||||
rc = rdp_recv_out_of_sequence_pdu(rdp, s);
|
||||
if (state_run_failed(rc))
|
||||
return rc;
|
||||
if (!tpkt_ensure_stream_consumed(s, length))
|
||||
return STATE_RUN_FAILED;
|
||||
return rc;
|
||||
case PDU_TYPE_DEMAND_ACTIVE:
|
||||
if (!rdp_recv_demand_active(rdp, s, pduSource, length))
|
||||
return STATE_RUN_FAILED;
|
||||
break;
|
||||
default:
|
||||
return rdp_recv_out_of_sequence_pdu(rdp, s, pduType, length);
|
||||
}
|
||||
|
||||
return STATE_RUN_SUCCESS;
|
||||
|
||||
Reference in New Issue
Block a user