[core,connection] improve parsing of demand active

Split up parsing, so we don´t have to reread the data.
This commit is contained in:
akallabeth
2023-11-21 11:35:54 +01:00
committed by David Fort
parent e3a84921de
commit 0ee61dcb62
5 changed files with 54 additions and 88 deletions

View File

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