From be714d2a1378469b45130de8ccc2811470526c59 Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Fri, 21 Feb 2020 09:17:00 +0100 Subject: [PATCH] Fixed tpkt header length checks. TPKT header length and consumption of data was not consistently checked. This adds checks after each packet processed and fixes any inconsistencies found. --- libfreerdp/core/activation.c | 2 + libfreerdp/core/capabilities.c | 22 ++++++---- libfreerdp/core/capabilities.h | 3 +- libfreerdp/core/channels.c | 17 +++++--- libfreerdp/core/connection.c | 58 ++++++++++++++++++++++++- libfreerdp/core/connection.h | 4 +- libfreerdp/core/peer.c | 97 +++++++++++++++++++++++++----------------- libfreerdp/core/rdp.c | 33 ++++++++------ libfreerdp/core/server.c | 18 +++----- libfreerdp/core/tpkt.c | 2 +- 10 files changed, 169 insertions(+), 87 deletions(-) diff --git a/libfreerdp/core/activation.c b/libfreerdp/core/activation.c index 51d95da..f97807a 100644 --- a/libfreerdp/core/activation.c +++ b/libfreerdp/core/activation.c @@ -196,6 +196,8 @@ BOOL rdp_recv_client_font_list_pdu(wStream* s) if (Stream_GetRemainingLength(s) < 8) return FALSE; + /* 2.2.1.18.1 Font List PDU Data (TS_FONT_LIST_PDU) */ + Stream_Seek(s, 8); return TRUE; } diff --git a/libfreerdp/core/capabilities.c b/libfreerdp/core/capabilities.c index 6bb9112..d672737 100644 --- a/libfreerdp/core/capabilities.c +++ b/libfreerdp/core/capabilities.c @@ -3836,10 +3836,11 @@ static BOOL rdp_read_capability_sets(wStream* s, rdpSettings* settings, UINT16 n Stream_SetPosition(s, end); } #endif - if (len < totalLength) + + if (len > totalLength) { - if (!Stream_SafeSeek(s, totalLength - len)) - return FALSE; + WLog_ERR(TAG, "Capability length expected %" PRIu16 ", actual %" PRIdz, totalLength, len); + return FALSE; } return TRUE; } @@ -3950,6 +3951,9 @@ BOOL rdp_recv_demand_active(rdpRdp* rdp, wStream* s) return FALSE; } + if (!Stream_SafeSeek(s, 4)) /* SessionId */ + return FALSE; + rdp->update->secondary->glyph_v2 = (rdp->settings->GlyphSupportLevel > GLYPH_SUPPORT_FULL); return tpkt_ensure_stream_consumed(s, length); } @@ -4043,9 +4047,8 @@ BOOL rdp_send_demand_active(rdpRdp* rdp) return status; } -BOOL rdp_recv_confirm_active(rdpRdp* rdp, wStream* s) +BOOL rdp_recv_confirm_active(rdpRdp* rdp, wStream* s, UINT16 pduLength) { - BOOL status; rdpSettings* settings; UINT16 lengthSourceDescriptor; UINT16 lengthCombinedCapabilities; @@ -4066,8 +4069,8 @@ BOOL rdp_recv_confirm_active(rdpRdp* rdp, wStream* s) Stream_Seek(s, lengthSourceDescriptor); /* sourceDescriptor */ Stream_Read_UINT16(s, numberCapabilities); /* numberCapabilities (2 bytes) */ Stream_Seek(s, 2); /* pad2Octets (2 bytes) */ - status = - rdp_read_capability_sets(s, rdp->settings, numberCapabilities, lengthCombinedCapabilities); + if (!rdp_read_capability_sets(s, rdp->settings, numberCapabilities, lengthCombinedCapabilities)) + return FALSE; if (!settings->ReceivedCapabilities[CAPSET_TYPE_SURFACE_COMMANDS]) { @@ -4108,10 +4111,10 @@ BOOL rdp_recv_confirm_active(rdpRdp* rdp, wStream* s) settings->LargePointerFlag = 0; } - return status; + return tpkt_ensure_stream_consumed(s, pduLength); } -BOOL rdp_write_confirm_active(wStream* s, rdpSettings* settings) +static BOOL rdp_write_confirm_active(wStream* s, rdpSettings* settings) { size_t bm, em, lm; UINT16 numberCapabilities; @@ -4257,6 +4260,7 @@ BOOL rdp_write_confirm_active(wStream* s, rdpSettings* settings) Stream_Seek_UINT16(s); #endif Stream_SetPosition(s, em); + return TRUE; } diff --git a/libfreerdp/core/capabilities.h b/libfreerdp/core/capabilities.h index dbf8cb0..fea838b 100644 --- a/libfreerdp/core/capabilities.h +++ b/libfreerdp/core/capabilities.h @@ -169,8 +169,7 @@ FREERDP_LOCAL BOOL rdp_recv_get_active_header(rdpRdp* rdp, wStream* s, UINT16* p UINT16* length); FREERDP_LOCAL BOOL rdp_recv_demand_active(rdpRdp* rdp, wStream* s); FREERDP_LOCAL BOOL rdp_send_demand_active(rdpRdp* rdp); -FREERDP_LOCAL BOOL rdp_recv_confirm_active(rdpRdp* rdp, wStream* s); -FREERDP_LOCAL BOOL rdp_write_confirm_active(wStream* s, rdpSettings* settings); +FREERDP_LOCAL BOOL rdp_recv_confirm_active(rdpRdp* rdp, wStream* s, UINT16 pduLength); FREERDP_LOCAL BOOL rdp_send_confirm_active(rdpRdp* rdp); #endif /* FREERDP_LIB_CORE_CAPABILITIES_H */ diff --git a/libfreerdp/core/channels.c b/libfreerdp/core/channels.c index 5df1392..b20c23f 100644 --- a/libfreerdp/core/channels.c +++ b/libfreerdp/core/channels.c @@ -145,7 +145,7 @@ BOOL freerdp_channel_peer_process(freerdp_peer* client, wStream* s, UINT16 chann { UINT32 length; UINT32 flags; - int chunkLength; + size_t chunkLength; if (Stream_GetRemainingLength(s) < 8) return FALSE; @@ -156,6 +156,7 @@ BOOL freerdp_channel_peer_process(freerdp_peer* client, wStream* s, UINT16 chann if (client->VirtualChannelRead) { + int rc; UINT32 index; BOOL found = FALSE; HANDLE hChannel = 0; @@ -178,16 +179,18 @@ BOOL freerdp_channel_peer_process(freerdp_peer* client, wStream* s, UINT16 chann if (!found) return FALSE; - client->VirtualChannelRead(client, hChannel, Stream_Pointer(s), - Stream_GetRemainingLength(s)); + rc = client->VirtualChannelRead(client, hChannel, Stream_Pointer(s), chunkLength); + if (rc < 0) + return FALSE; } else if (client->ReceiveChannelData) { - client->ReceiveChannelData(client, channelId, Stream_Pointer(s), chunkLength, flags, - length); + int rc = client->ReceiveChannelData(client, channelId, Stream_Pointer(s), chunkLength, + flags, length); + if (rc < 0) + return FALSE; } - - return TRUE; + return Stream_SafeSeek(s, chunkLength); } static const WtsApiFunctionTable FreeRDP_WtsApiFunctionTable = { diff --git a/libfreerdp/core/connection.c b/libfreerdp/core/connection.c index 4a5bfd0..6c6ae26 100644 --- a/libfreerdp/core/connection.c +++ b/libfreerdp/core/connection.c @@ -1380,14 +1380,14 @@ BOOL rdp_server_accept_mcs_channel_join_request(rdpRdp* rdp, wStream* s) return TRUE; } -BOOL rdp_server_accept_confirm_active(rdpRdp* rdp, wStream* s) +BOOL rdp_server_accept_confirm_active(rdpRdp* rdp, wStream* s, UINT16 pduLength) { freerdp_peer* peer = rdp->context->peer; if (rdp->state != CONNECTION_STATE_CAPABILITIES_EXCHANGE) return FALSE; - if (!rdp_recv_confirm_active(rdp, s)) + if (!rdp_recv_confirm_active(rdp, s, pduLength)) return FALSE; if (peer->ClientCapabilities && !peer->ClientCapabilities(peer)) @@ -1535,3 +1535,57 @@ int rdp_server_transition_to_state(rdpRdp* rdp, int state) return status; } + +const char* rdp_client_connection_state_string(int state) +{ + switch (state) + { + case CLIENT_STATE_INITIAL: + return "CLIENT_STATE_INITIAL"; + case CLIENT_STATE_PRECONNECT_PASSED: + return "CLIENT_STATE_PRECONNECT_PASSED"; + case CLIENT_STATE_POSTCONNECT_PASSED: + return "CLIENT_STATE_POSTCONNECT_PASSED"; + default: + return "UNKNOWN"; + } +} + +const char* rdp_server_connection_state_string(int state) +{ + switch (state) + { + case CONNECTION_STATE_INITIAL: + return "CONNECTION_STATE_INITIAL"; + case CONNECTION_STATE_NEGO: + return "CONNECTION_STATE_NEGO"; + case CONNECTION_STATE_NLA: + return "CONNECTION_STATE_NLA"; + case CONNECTION_STATE_MCS_CONNECT: + return "CONNECTION_STATE_MCS_CONNECT"; + case CONNECTION_STATE_MCS_ERECT_DOMAIN: + return "CONNECTION_STATE_MCS_ERECT_DOMAIN"; + case CONNECTION_STATE_MCS_ATTACH_USER: + return "CONNECTION_STATE_MCS_ATTACH_USER"; + case CONNECTION_STATE_MCS_CHANNEL_JOIN: + return "CONNECTION_STATE_MCS_CHANNEL_JOIN"; + case CONNECTION_STATE_RDP_SECURITY_COMMENCEMENT: + return "CONNECTION_STATE_RDP_SECURITY_COMMENCEMENT"; + case CONNECTION_STATE_SECURE_SETTINGS_EXCHANGE: + return "CONNECTION_STATE_SECURE_SETTINGS_EXCHANGE"; + case CONNECTION_STATE_CONNECT_TIME_AUTO_DETECT: + return "CONNECTION_STATE_CONNECT_TIME_AUTO_DETECT"; + case CONNECTION_STATE_LICENSING: + return "CONNECTION_STATE_LICENSING"; + case CONNECTION_STATE_MULTITRANSPORT_BOOTSTRAPPING: + return "CONNECTION_STATE_MULTITRANSPORT_BOOTSTRAPPING"; + case CONNECTION_STATE_CAPABILITIES_EXCHANGE: + return "CONNECTION_STATE_CAPABILITIES_EXCHANGE"; + case CONNECTION_STATE_FINALIZATION: + return "CONNECTION_STATE_FINALIZATION"; + case CONNECTION_STATE_ACTIVE: + return "CONNECTION_STATE_ACTIVE"; + default: + return "UNKNOWN"; + } +} diff --git a/libfreerdp/core/connection.h b/libfreerdp/core/connection.h index 1296f33..ee60696 100644 --- a/libfreerdp/core/connection.h +++ b/libfreerdp/core/connection.h @@ -66,15 +66,17 @@ FREERDP_LOCAL BOOL rdp_client_connect_auto_detect(rdpRdp* rdp, wStream* s); FREERDP_LOCAL int rdp_client_connect_license(rdpRdp* rdp, wStream* s); FREERDP_LOCAL int rdp_client_connect_demand_active(rdpRdp* rdp, wStream* s); FREERDP_LOCAL int rdp_client_transition_to_state(rdpRdp* rdp, int state); +FREERDP_LOCAL const char* rdp_client_connection_state_string(int state); FREERDP_LOCAL BOOL rdp_server_accept_nego(rdpRdp* rdp, wStream* s); FREERDP_LOCAL BOOL rdp_server_accept_mcs_connect_initial(rdpRdp* rdp, wStream* s); FREERDP_LOCAL BOOL rdp_server_accept_mcs_erect_domain_request(rdpRdp* rdp, wStream* s); FREERDP_LOCAL BOOL rdp_server_accept_mcs_attach_user_request(rdpRdp* rdp, wStream* s); FREERDP_LOCAL BOOL rdp_server_accept_mcs_channel_join_request(rdpRdp* rdp, wStream* s); -FREERDP_LOCAL BOOL rdp_server_accept_confirm_active(rdpRdp* rdp, wStream* s); +FREERDP_LOCAL BOOL rdp_server_accept_confirm_active(rdpRdp* rdp, wStream* s, UINT16 pduLength); FREERDP_LOCAL BOOL rdp_server_establish_keys(rdpRdp* rdp, wStream* s); FREERDP_LOCAL BOOL rdp_server_reactivate(rdpRdp* rdp); FREERDP_LOCAL int rdp_server_transition_to_state(rdpRdp* rdp, int state); +FREERDP_LOCAL const char* rdp_server_connection_state_string(int state); #endif /* FREERDP_LIB_CORE_CONNECTION_H */ diff --git a/libfreerdp/core/peer.c b/libfreerdp/core/peer.c index 8bfdaf9..f6b83df 100644 --- a/libfreerdp/core/peer.c +++ b/libfreerdp/core/peer.c @@ -268,7 +268,7 @@ static BOOL freerdp_peer_check_fds(freerdp_peer* peer) return TRUE; } -static BOOL peer_recv_data_pdu(freerdp_peer* client, wStream* s) +static BOOL peer_recv_data_pdu(freerdp_peer* client, wStream* s, UINT16 totalLength) { BYTE type; UINT16 length; @@ -395,13 +395,13 @@ static int peer_recv_tpkt_pdu(freerdp_peer* client, wStream* s) switch (pduType) { case PDU_TYPE_DATA: - if (!peer_recv_data_pdu(client, s)) + if (!peer_recv_data_pdu(client, s, pduLength)) return -1; break; case PDU_TYPE_CONFIRM_ACTIVE: - if (!rdp_server_accept_confirm_active(rdp, s)) + if (!rdp_server_accept_confirm_active(rdp, s, pduLength)) return -1; break; @@ -416,7 +416,7 @@ static int peer_recv_tpkt_pdu(freerdp_peer* client, wStream* s) return -1; } } - else if (rdp->mcs->messageChannelId && channelId == rdp->mcs->messageChannelId) + else if ((rdp->mcs->messageChannelId > 0) && (channelId == rdp->mcs->messageChannelId)) { if (!rdp->settings->UseRdpSecurityLayer) if (!rdp_read_security_header(s, &securityFlags, NULL)) @@ -483,9 +483,8 @@ static int peer_recv_callback(rdpTransport* transport, wStream* s, void* extra) case CONNECTION_STATE_INITIAL: if (!rdp_server_accept_nego(rdp, s)) { - WLog_ERR( - TAG, - "peer_recv_callback: CONNECTION_STATE_INITIAL - rdp_server_accept_nego() fail"); + WLog_ERR(TAG, "%s: %s - rdp_server_accept_nego() fail", __FUNCTION__, + rdp_server_connection_state_string(rdp->state)); return -1; } @@ -511,8 +510,10 @@ static int peer_recv_callback(rdpTransport* transport, wStream* s, void* extra) case CONNECTION_STATE_NEGO: if (!rdp_server_accept_mcs_connect_initial(rdp, s)) { - WLog_ERR(TAG, "peer_recv_callback: CONNECTION_STATE_NEGO - " - "rdp_server_accept_mcs_connect_initial() fail"); + WLog_ERR(TAG, + "%s: %s - " + "rdp_server_accept_mcs_connect_initial() fail", + __FUNCTION__, rdp_server_connection_state_string(rdp->state)); return -1; } @@ -521,8 +522,10 @@ static int peer_recv_callback(rdpTransport* transport, wStream* s, void* extra) case CONNECTION_STATE_MCS_CONNECT: if (!rdp_server_accept_mcs_erect_domain_request(rdp, s)) { - WLog_ERR(TAG, "peer_recv_callback: CONNECTION_STATE_MCS_CONNECT - " - "rdp_server_accept_mcs_erect_domain_request() fail"); + WLog_ERR(TAG, + "%s: %s - " + "rdp_server_accept_mcs_erect_domain_request() fail", + __FUNCTION__, rdp_server_connection_state_string(rdp->state)); return -1; } @@ -531,8 +534,10 @@ static int peer_recv_callback(rdpTransport* transport, wStream* s, void* extra) case CONNECTION_STATE_MCS_ERECT_DOMAIN: if (!rdp_server_accept_mcs_attach_user_request(rdp, s)) { - WLog_ERR(TAG, "peer_recv_callback: CONNECTION_STATE_MCS_ERECT_DOMAIN - " - "rdp_server_accept_mcs_attach_user_request() fail"); + WLog_ERR(TAG, + "%s: %s - " + "rdp_server_accept_mcs_attach_user_request() fail", + __FUNCTION__, rdp_server_connection_state_string(rdp->state)); return -1; } @@ -541,8 +546,10 @@ static int peer_recv_callback(rdpTransport* transport, wStream* s, void* extra) case CONNECTION_STATE_MCS_ATTACH_USER: if (!rdp_server_accept_mcs_channel_join_request(rdp, s)) { - WLog_ERR(TAG, "peer_recv_callback: CONNECTION_STATE_MCS_ATTACH_USER - " - "rdp_server_accept_mcs_channel_join_request() fail"); + WLog_ERR(TAG, + "%s: %s - " + "rdp_server_accept_mcs_channel_join_request() fail", + __FUNCTION__, rdp_server_connection_state_string(rdp->state)); return -1; } @@ -554,8 +561,9 @@ static int peer_recv_callback(rdpTransport* transport, wStream* s, void* extra) if (!rdp_server_establish_keys(rdp, s)) { WLog_ERR(TAG, - "peer_recv_callback: CONNECTION_STATE_RDP_SECURITY_COMMENCEMENT - " - "rdp_server_establish_keys() fail"); + "%s: %s - " + "rdp_server_establish_keys() fail", + __FUNCTION__, rdp_server_connection_state_string(rdp->state)); return -1; } } @@ -570,14 +578,15 @@ static int peer_recv_callback(rdpTransport* transport, wStream* s, void* extra) case CONNECTION_STATE_SECURE_SETTINGS_EXCHANGE: if (!rdp_recv_client_info(rdp, s)) { - WLog_ERR(TAG, "peer_recv_callback: CONNECTION_STATE_SECURE_SETTINGS_EXCHANGE - " - "rdp_recv_client_info() fail"); + WLog_ERR(TAG, + "%s: %s - " + "rdp_recv_client_info() fail", + __FUNCTION__, rdp_server_connection_state_string(rdp->state)); return -1; } rdp_server_transition_to_state(rdp, CONNECTION_STATE_LICENSING); return peer_recv_callback(transport, NULL, extra); - break; case CONNECTION_STATE_LICENSING: { @@ -585,8 +594,10 @@ static int peer_recv_callback(rdpTransport* transport, wStream* s, void* extra) if (!client->LicenseCallback) { - WLog_ERR(TAG, "peer_recv_callback: LicenseCallback has been removed, assuming " - "licensing is ok (please fix your app)"); + WLog_ERR(TAG, + "%s: LicenseCallback has been removed, assuming " + "licensing is ok (please fix your app)", + __FUNCTION__); res = LICENSE_CB_COMPLETED; } else @@ -596,8 +607,9 @@ static int peer_recv_callback(rdpTransport* transport, wStream* s, void* extra) { case LICENSE_CB_INTERNAL_ERROR: WLog_ERR(TAG, - "peer_recv_callback: CONNECTION_STATE_LICENSING - callback internal " - "error, aborting"); + "%s: %s - callback internal " + "error, aborting", + __FUNCTION__, rdp_server_connection_state_string(rdp->state)); return -1; case LICENSE_CB_ABORT: @@ -611,11 +623,10 @@ static int peer_recv_callback(rdpTransport* transport, wStream* s, void* extra) return peer_recv_callback(transport, NULL, extra); default: - WLog_ERR( - TAG, - "peer_recv_callback: CONNECTION_STATE_LICENSING - unknown license callback " - "result %d", - (int)res); + WLog_ERR(TAG, + "%s: CONNECTION_STATE_LICENSING - unknown license callback " + "result %d", + __FUNCTION__, res); break; } @@ -630,8 +641,10 @@ static int peer_recv_callback(rdpTransport* transport, wStream* s, void* extra) if (!rdp_send_demand_active(rdp)) { - WLog_ERR(TAG, "peer_recv_callback: CONNECTION_STATE_CAPABILITIES_EXCHANGE - " - "rdp_send_demand_active() fail"); + WLog_ERR(TAG, + "%s: %s - " + "rdp_send_demand_active() fail", + __FUNCTION__, rdp_server_connection_state_string(rdp->state)); return -1; } @@ -642,8 +655,9 @@ static int peer_recv_callback(rdpTransport* transport, wStream* s, void* extra) if (peer_recv_pdu(client, s) < 0) { WLog_ERR(TAG, - "peer_recv_callback: CONNECTION_STATE_CAPABILITIES_EXCHANGE - " - "peer_recv_pdu() fail"); + "%s: %s - " + "peer_recv_pdu() fail", + __FUNCTION__, rdp_server_connection_state_string(rdp->state)); return -1; } } @@ -656,8 +670,10 @@ static int peer_recv_callback(rdpTransport* transport, wStream* s, void* extra) */ if (peer_recv_pdu(client, s) < 0) { - WLog_ERR(TAG, "peer_recv_callback: CONNECTION_STATE_CAPABILITIES_EXCHANGE - " - "peer_recv_pdu() fail"); + WLog_ERR(TAG, + "%s: %s - " + "peer_recv_pdu() fail", + __FUNCTION__, rdp_server_connection_state_string(rdp->state)); return -1; } } @@ -667,9 +683,8 @@ static int peer_recv_callback(rdpTransport* transport, wStream* s, void* extra) case CONNECTION_STATE_FINALIZATION: if (peer_recv_pdu(client, s) < 0) { - WLog_ERR( - TAG, - "peer_recv_callback: CONNECTION_STATE_FINALIZATION - peer_recv_pdu() fail"); + WLog_ERR(TAG, "%s: %s - peer_recv_pdu() fail", __FUNCTION__, + rdp_server_connection_state_string(rdp->state)); return -1; } @@ -678,14 +693,16 @@ static int peer_recv_callback(rdpTransport* transport, wStream* s, void* extra) case CONNECTION_STATE_ACTIVE: if (peer_recv_pdu(client, s) < 0) { - WLog_ERR(TAG, "peer_recv_callback: CONNECTION_STATE_ACTIVE - peer_recv_pdu() fail"); + WLog_ERR(TAG, "%s: %s - peer_recv_pdu() fail", __FUNCTION__, + rdp_server_connection_state_string(rdp->state)); return -1; } break; default: - WLog_ERR(TAG, "Invalid state %d", rdp->state); + WLog_ERR(TAG, "%s state %d", rdp_server_connection_state_string(rdp->state), + rdp->state); return -1; } diff --git a/libfreerdp/core/rdp.c b/libfreerdp/core/rdp.c index c3ab37c..aabd1d8 100644 --- a/libfreerdp/core/rdp.c +++ b/libfreerdp/core/rdp.c @@ -1433,7 +1433,8 @@ int rdp_recv_callback(rdpTransport* transport, wStream* s, void* extra) { if (nla_recv_pdu(rdp->nla, s) < 1) { - WLog_ERR(TAG, "rdp_recv_callback: CONNECTION_STATE_NLA - nla_recv_pdu() fail"); + WLog_ERR(TAG, "%s: %s - nla_recv_pdu() fail", __FUNCTION__, + rdp_server_connection_state_string(rdp->state)); return -1; } } @@ -1443,7 +1444,8 @@ int rdp_recv_callback(rdpTransport* transport, wStream* s, void* extra) if (nego_get_state(rdp->nego) != NEGO_STATE_FINAL) { - WLog_ERR(TAG, "rdp_recv_callback: CONNECTION_STATE_NLA - nego_recv() fail"); + WLog_ERR(TAG, "%s: %s - nego_recv() fail", __FUNCTION__, + rdp_server_connection_state_string(rdp->state)); return -1; } @@ -1482,8 +1484,8 @@ int rdp_recv_callback(rdpTransport* transport, wStream* s, void* extra) if (!mcs_client_begin(rdp->mcs)) { - WLog_ERR(TAG, - "rdp_recv_callback: CONNECTION_STATE_NLA - mcs_client_begin() fail"); + WLog_ERR(TAG, "%s: %s - mcs_client_begin() fail", __FUNCTION__, + rdp_server_connection_state_string(rdp->state)); return -1; } } @@ -1531,8 +1533,10 @@ int rdp_recv_callback(rdpTransport* transport, wStream* s, void* extra) case CONNECTION_STATE_MCS_CHANNEL_JOIN: if (!rdp_client_connect_mcs_channel_join_confirm(rdp, s)) { - WLog_ERR(TAG, "rdp_recv_callback: CONNECTION_STATE_MCS_CHANNEL_JOIN - " - "rdp_client_connect_mcs_channel_join_confirm() fail"); + WLog_ERR(TAG, + "%s: %s - " + "rdp_client_connect_mcs_channel_join_confirm() fail", + __FUNCTION__, rdp_server_connection_state_string(rdp->state)); status = -1; } @@ -1542,8 +1546,8 @@ int rdp_recv_callback(rdpTransport* transport, wStream* s, void* extra) status = rdp_client_connect_license(rdp, s); if (status < 0) - WLog_DBG(TAG, "CONNECTION_STATE_LICENSING - rdp_client_connect_license() - %i", - status); + WLog_DBG(TAG, "%s: %s - rdp_client_connect_license() - %i", __FUNCTION__, + rdp_server_connection_state_string(rdp->state), status); break; @@ -1552,9 +1556,9 @@ int rdp_recv_callback(rdpTransport* transport, wStream* s, void* extra) if (status < 0) WLog_DBG(TAG, - "CONNECTION_STATE_CAPABILITIES_EXCHANGE - " + "%s: %s - " "rdp_client_connect_demand_active() - %i", - status); + __FUNCTION__, rdp_server_connection_state_string(rdp->state), status); break; @@ -1573,7 +1577,8 @@ int rdp_recv_callback(rdpTransport* transport, wStream* s, void* extra) } if (status < 0) - WLog_DBG(TAG, "CONNECTION_STATE_FINALIZATION - rdp_recv_pdu() - %i", status); + WLog_DBG(TAG, "%s: %s - rdp_recv_pdu() - %i", __FUNCTION__, + rdp_server_connection_state_string(rdp->state), status); break; @@ -1581,12 +1586,14 @@ int rdp_recv_callback(rdpTransport* transport, wStream* s, void* extra) status = rdp_recv_pdu(rdp, s); if (status < 0) - WLog_DBG(TAG, "CONNECTION_STATE_ACTIVE - rdp_recv_pdu() - %i", status); + WLog_DBG(TAG, "%s: %s - rdp_recv_pdu() - %i", __FUNCTION__, + rdp_server_connection_state_string(rdp->state), status); break; default: - WLog_ERR(TAG, "Invalid state %d", rdp->state); + WLog_ERR(TAG, "%s: %s state %d", __FUNCTION__, + rdp_server_connection_state_string(rdp->state), rdp->state); status = -1; break; } diff --git a/libfreerdp/core/server.c b/libfreerdp/core/server.c index b28b319..d890180 100644 --- a/libfreerdp/core/server.c +++ b/libfreerdp/core/server.c @@ -403,27 +403,21 @@ static int WTSReceiveChannelData(freerdp_peer* client, UINT16 channelId, const B { UINT32 i; BOOL status = FALSE; - rdpPeerChannel* channel; rdpMcs* mcs = client->context->rdp->mcs; for (i = 0; i < mcs->channelCount; i++) { if (mcs->channels[i].ChannelId == channelId) - break; - } - - if (i < mcs->channelCount) - { - channel = (rdpPeerChannel*)mcs->channels[i].handle; - - if (channel) { - WTSProcessChannelData(channel, channelId, data, size, flags, totalSize); - status = TRUE; + rdpPeerChannel* channel = (rdpPeerChannel*)mcs->channels[i].handle; + + if (channel) + status = WTSProcessChannelData(channel, channelId, data, size, flags, totalSize); + break; } } - return status; + return status ? 0 : -1; } void WTSVirtualChannelManagerGetFileDescriptor(HANDLE hServer, void** fds, int* fds_count) diff --git a/libfreerdp/core/tpkt.c b/libfreerdp/core/tpkt.c index 93820dc..57993f9 100644 --- a/libfreerdp/core/tpkt.c +++ b/libfreerdp/core/tpkt.c @@ -27,7 +27,7 @@ #include -#define TAG FREERDP_TAG(".core.tpkt") +#define TAG FREERDP_TAG("core.tpkt") /** * TPKTs are defined in: -- 2.7.4