diff --git a/libfreerdp/core/fastpath.c b/libfreerdp/core/fastpath.c index 7a43c6c6a..b6c012401 100644 --- a/libfreerdp/core/fastpath.c +++ b/libfreerdp/core/fastpath.c @@ -506,7 +506,7 @@ static BOOL fastpath_recv_input_event(rdpFastPath* fastpath, STREAM* s) return TRUE; } -BOOL fastpath_recv_inputs(rdpFastPath* fastpath, STREAM* s) +int fastpath_recv_inputs(rdpFastPath* fastpath, STREAM* s) { BYTE i; @@ -518,7 +518,7 @@ BOOL fastpath_recv_inputs(rdpFastPath* fastpath, STREAM* s) */ if (stream_get_left(s) < 1) - return FALSE; + return -1; stream_read_BYTE(s, fastpath->numberEvents); /* eventHeader (1 byte) */ } @@ -526,10 +526,10 @@ BOOL fastpath_recv_inputs(rdpFastPath* fastpath, STREAM* s) for (i = 0; i < fastpath->numberEvents; i++) { if (!fastpath_recv_input_event(fastpath, s)) - return FALSE; + return -1; } - return TRUE; + return 0; } static UINT32 fastpath_get_sec_bytes(rdpRdp* rdp) diff --git a/libfreerdp/core/nego.c b/libfreerdp/core/nego.c index 07c6ea035..770c6da8c 100644 --- a/libfreerdp/core/nego.c +++ b/libfreerdp/core/nego.c @@ -465,9 +465,9 @@ BOOL nego_recv_response(rdpNego* nego) STREAM* s = transport_recv_stream_init(nego->transport, 1024); if (transport_read(nego->transport, s) < 0) - return FALSE; + return -1; - return nego_recv(nego->transport, s, nego); + return ((nego_recv(nego->transport, s, nego) < 0) ? FALSE : TRUE); } /** @@ -478,7 +478,7 @@ BOOL nego_recv_response(rdpNego* nego) * @param extra nego pointer */ -BOOL nego_recv(rdpTransport* transport, STREAM* s, void* extra) +int nego_recv(rdpTransport* transport, STREAM* s, void* extra) { BYTE li; BYTE type; @@ -488,7 +488,7 @@ BOOL nego_recv(rdpTransport* transport, STREAM* s, void* extra) length = tpkt_read_header(s); if (length == 0) - return FALSE; + return -1; li = tpdu_read_connection_confirm(s); @@ -546,7 +546,7 @@ BOOL nego_recv(rdpTransport* transport, STREAM* s, void* extra) nego->state = NEGO_STATE_FAIL; } - return TRUE; + return 0; } /** diff --git a/libfreerdp/core/nego.h b/libfreerdp/core/nego.h index 5b9c31079..622f8f33b 100644 --- a/libfreerdp/core/nego.h +++ b/libfreerdp/core/nego.h @@ -117,7 +117,7 @@ void nego_attempt_tls(rdpNego* nego); void nego_attempt_rdp(rdpNego* nego); void nego_send(rdpNego* nego); -BOOL nego_recv(rdpTransport* transport, STREAM* s, void* extra); +int nego_recv(rdpTransport* transport, STREAM* s, void* extra); BOOL nego_recv_response(rdpNego* nego); BOOL nego_read_request(rdpNego* nego, STREAM* s); diff --git a/libfreerdp/core/peer.c b/libfreerdp/core/peer.c index 059de8cf9..215bcb9c3 100644 --- a/libfreerdp/core/peer.c +++ b/libfreerdp/core/peer.c @@ -156,7 +156,7 @@ static BOOL peer_recv_data_pdu(freerdp_peer* client, STREAM* s) return TRUE; } -static BOOL peer_recv_tpkt_pdu(freerdp_peer* client, STREAM* s) +static int peer_recv_tpkt_pdu(freerdp_peer* client, STREAM* s) { rdpRdp* rdp; UINT16 length; @@ -171,7 +171,7 @@ static BOOL peer_recv_tpkt_pdu(freerdp_peer* client, STREAM* s) if (!rdp_read_header(rdp, s, &length, &channelId)) { printf("Incorrect RDP header.\n"); - return FALSE; + return -1; } if (rdp->settings->DisableEncryption) @@ -183,7 +183,7 @@ static BOOL peer_recv_tpkt_pdu(freerdp_peer* client, STREAM* s) if (!rdp_decrypt(rdp, s, length - 4, securityFlags)) { printf("rdp_decrypt failed\n"); - return FALSE; + return -1; } } } @@ -195,7 +195,7 @@ static BOOL peer_recv_tpkt_pdu(freerdp_peer* client, STREAM* s) else { if (!rdp_read_share_control_header(s, &pduLength, &pduType, &pduSource)) - return FALSE; + return -1; client->settings->PduSource = pduSource; @@ -203,19 +203,19 @@ static BOOL peer_recv_tpkt_pdu(freerdp_peer* client, STREAM* s) { case PDU_TYPE_DATA: if (!peer_recv_data_pdu(client, s)) - return FALSE; + return -1; break; default: printf("Client sent pduType %d\n", pduType); - return FALSE; + return -1; } } - return TRUE; + return 0; } -static BOOL peer_recv_fastpath_pdu(freerdp_peer* client, STREAM* s) +static int peer_recv_fastpath_pdu(freerdp_peer* client, STREAM* s) { rdpRdp* rdp; UINT16 length; @@ -225,10 +225,10 @@ static BOOL peer_recv_fastpath_pdu(freerdp_peer* client, STREAM* s) fastpath = rdp->fastpath; length = fastpath_read_header_rdp(fastpath, s); - if (length == 0 || length > stream_get_left(s)) + if ((length == 0) || (length > stream_get_left(s))) { printf("incorrect FastPath PDU header length %d\n", length); - return FALSE; + return -1; } if (fastpath->encryptionFlags & FASTPATH_OUTPUT_ENCRYPTED) @@ -239,7 +239,7 @@ static BOOL peer_recv_fastpath_pdu(freerdp_peer* client, STREAM* s) return fastpath_recv_inputs(fastpath, s); } -static BOOL peer_recv_pdu(freerdp_peer* client, STREAM* s) +static int peer_recv_pdu(freerdp_peer* client, STREAM* s) { if (tpkt_verify_header(s)) return peer_recv_tpkt_pdu(client, s); @@ -256,7 +256,7 @@ static BOOL peer_recv_callback(rdpTransport* transport, STREAM* s, void* extra) { case CONNECTION_STATE_INITIAL: if (!rdp_server_accept_nego(rdp, s)) - return FALSE; + return -1; if (rdp->nego->selected_protocol & PROTOCOL_NLA) { @@ -273,29 +273,29 @@ static BOOL peer_recv_callback(rdpTransport* transport, STREAM* s, void* extra) case CONNECTION_STATE_NEGO: if (!rdp_server_accept_mcs_connect_initial(rdp, s)) - return FALSE; + return -1; break; case CONNECTION_STATE_MCS_CONNECT: if (!rdp_server_accept_mcs_erect_domain_request(rdp, s)) - return FALSE; + return -1; break; case CONNECTION_STATE_MCS_ERECT_DOMAIN: if (!rdp_server_accept_mcs_attach_user_request(rdp, s)) - return FALSE; + return -1; break; case CONNECTION_STATE_MCS_ATTACH_USER: if (!rdp_server_accept_mcs_channel_join_request(rdp, s)) - return FALSE; + return -1; break; case CONNECTION_STATE_MCS_CHANNEL_JOIN: if (rdp->settings->DisableEncryption) { if (!rdp_server_accept_client_keys(rdp, s)) - return FALSE; + return -1; break; } rdp->state = CONNECTION_STATE_ESTABLISH_KEYS; @@ -303,12 +303,12 @@ static BOOL peer_recv_callback(rdpTransport* transport, STREAM* s, void* extra) case CONNECTION_STATE_ESTABLISH_KEYS: if (!rdp_server_accept_client_info(rdp, s)) - return FALSE; + return -1; IFCALL(client->Capabilities, client); if (!rdp_send_demand_active(rdp)) - return FALSE; + return -1; break; case CONNECTION_STATE_LICENSE: @@ -325,15 +325,15 @@ static BOOL peer_recv_callback(rdpTransport* transport, STREAM* s, void* extra) case CONNECTION_STATE_ACTIVE: if (!peer_recv_pdu(client, s)) - return FALSE; + return -1; break; default: printf("Invalid state %d\n", rdp->state); - return FALSE; + return -1; } - return TRUE; + return 0; } static BOOL freerdp_peer_close(freerdp_peer* client) diff --git a/libfreerdp/core/rdp.c b/libfreerdp/core/rdp.c index 999e7b567..2c10b1b61 100644 --- a/libfreerdp/core/rdp.c +++ b/libfreerdp/core/rdp.c @@ -850,50 +850,50 @@ static BOOL rdp_recv_callback(rdpTransport* transport, STREAM* s, void* extra) { case CONNECTION_STATE_NEGO: if (!rdp_client_connect_mcs_connect_response(rdp, s)) - return FALSE; + return -1; break; case CONNECTION_STATE_MCS_ATTACH_USER: if (!rdp_client_connect_mcs_attach_user_confirm(rdp, s)) - return FALSE; + return -1; break; case CONNECTION_STATE_MCS_CHANNEL_JOIN: if (!rdp_client_connect_mcs_channel_join_confirm(rdp, s)) - return FALSE; + return -1; break; case CONNECTION_STATE_LICENSE: if (!rdp_client_connect_license(rdp, s)) - return FALSE; + return -1; break; case CONNECTION_STATE_CAPABILITY: if (!rdp_client_connect_demand_active(rdp, s)) { printf("rdp_client_connect_demand_active failed\n"); - return FALSE; + return -1; } break; case CONNECTION_STATE_FINALIZATION: if (!rdp_recv_pdu(rdp, s)) - return FALSE; + return -1; if (rdp->finalize_sc_pdus == FINALIZE_SC_COMPLETE) rdp->state = CONNECTION_STATE_ACTIVE; break; case CONNECTION_STATE_ACTIVE: if (!rdp_recv_pdu(rdp, s)) - return FALSE; + return -1; break; default: printf("Invalid state %d\n", rdp->state); - return FALSE; + return -1; } - return TRUE; + return 0; } int rdp_send_channel_data(rdpRdp* rdp, int channel_id, BYTE* data, int size) diff --git a/libfreerdp/core/transport.c b/libfreerdp/core/transport.c index 75287059d..fc2be7b3a 100644 --- a/libfreerdp/core/transport.c +++ b/libfreerdp/core/transport.c @@ -589,6 +589,7 @@ int transport_check_fds(rdpTransport** ptransport) int pos; int status; UINT16 length; + int recv_status; STREAM* received; rdpTransport* transport = *ptransport; @@ -684,10 +685,21 @@ int transport_check_fds(rdpTransport** ptransport) stream_seal(received); stream_set_pos(received, 0); - if (transport->ReceiveCallback(transport, received, transport->ReceiveExtra) == FALSE) + /** + * ReceiveCallback return values: + * + * -1: synchronous failure + * 0: synchronous success + * 1: asynchronous return + */ + + recv_status = transport->ReceiveCallback(transport, received, transport->ReceiveExtra); + + if (recv_status < 0) status = -1; - transport_receive_pool_return(transport, received); + if (recv_status == 0) + transport_receive_pool_return(transport, received); if (status < 0) return status; diff --git a/winpr/libwinpr/crypto/test/TestCertEnumCertificatesInStore.c b/winpr/libwinpr/crypto/test/TestCertEnumCertificatesInStore.c index 5f81415a4..d4a909e5a 100644 --- a/winpr/libwinpr/crypto/test/TestCertEnumCertificatesInStore.c +++ b/winpr/libwinpr/crypto/test/TestCertEnumCertificatesInStore.c @@ -41,7 +41,7 @@ int TestCertEnumCertificatesInStore(int argc, char* argv[]) index = 0; - while (pCertContext = CertEnumCertificatesInStore(hCertStore, pCertContext)) + while ((pCertContext = CertEnumCertificatesInStore(hCertStore, pCertContext))) { status = CertGetNameString(pCertContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, NULL, NULL, 0);