diff --git a/include/freerdp/peer.h b/include/freerdp/peer.h index a6404444d..2c504c8a1 100644 --- a/include/freerdp/peer.h +++ b/include/freerdp/peer.h @@ -29,6 +29,7 @@ #include #include +#include typedef BOOL (*psPeerContextNew)(freerdp_peer* peer, rdpContext* context); typedef void (*psPeerContextFree)(freerdp_peer* peer, rdpContext* context); @@ -145,6 +146,8 @@ extern "C" FREERDP_API freerdp_peer* freerdp_peer_new(int sockfd); FREERDP_API void freerdp_peer_free(freerdp_peer* client); + FREERDP_API BOOL freerdp_peer_set_local_and_hostname(freerdp_peer* client, + const struct sockaddr_storage* peer_addr); #ifdef __cplusplus } diff --git a/libfreerdp/core/channels.c b/libfreerdp/core/channels.c index 5b8f5e9ab..f4e568483 100644 --- a/libfreerdp/core/channels.c +++ b/libfreerdp/core/channels.c @@ -57,13 +57,14 @@ BOOL freerdp_channel_send(rdpRdp* rdp, UINT16 channelId, const BYTE* data, size_ UINT32 flags; size_t chunkSize; rdpMcs* mcs = rdp->mcs; - rdpMcsChannel* channel = NULL; + const rdpMcsChannel* channel = NULL; for (i = 0; i < mcs->channelCount; i++) { - if (mcs->channels[i].ChannelId == channelId) + const rdpMcsChannel* cur = &mcs->channels[i]; + if (cur->ChannelId == channelId) { - channel = &mcs->channels[i]; + channel = cur; break; } } diff --git a/libfreerdp/core/client.c b/libfreerdp/core/client.c index bb04881dc..09a65fc49 100644 --- a/libfreerdp/core/client.c +++ b/libfreerdp/core/client.c @@ -55,7 +55,7 @@ static CHANNEL_OPEN_DATA* freerdp_channels_find_channel_open_data_by_name(rdpCha { pChannelOpenData = &channels->openDataList[index]; - if (strncmp(name, pChannelOpenData->name, CHANNEL_NAME_LEN) == 0) + if (strncmp(name, pChannelOpenData->name, CHANNEL_NAME_LEN + 1) == 0) return pChannelOpenData; } @@ -66,7 +66,6 @@ static CHANNEL_OPEN_DATA* freerdp_channels_find_channel_open_data_by_name(rdpCha static rdpMcsChannel* freerdp_channels_find_channel_by_name(rdpRdp* rdp, const char* name) { UINT32 index; - rdpMcsChannel* channel = NULL; rdpMcs* mcs = NULL; if (!rdp) @@ -76,9 +75,9 @@ static rdpMcsChannel* freerdp_channels_find_channel_by_name(rdpRdp* rdp, const c for (index = 0; index < mcs->channelCount; index++) { - channel = &mcs->channels[index]; + rdpMcsChannel* channel = &mcs->channels[index]; - if (strncmp(name, channel->Name, CHANNEL_NAME_LEN) == 0) + if (strncmp(name, channel->Name, CHANNEL_NAME_LEN + 1) == 0) { return channel; } @@ -471,9 +470,11 @@ BOOL freerdp_channels_data(freerdp* instance, UINT16 channelId, const BYTE* cdat for (index = 0; index < mcs->channelCount; index++) { - if (mcs->channels[index].ChannelId == channelId) + rdpMcsChannel* cur = &mcs->channels[index]; + + if (cur->ChannelId == channelId) { - channel = &mcs->channels[index]; + channel = cur; break; } } @@ -837,8 +838,9 @@ static UINT VCAPITYPE FreeRDP_VirtualChannelInitEx( if (settings->ChannelCount < CHANNEL_MAX_COUNT) { - CHANNEL_DEF* channel = &settings->ChannelDefArray[settings->ChannelCount]; - strncpy(channel->name, pChannelDef->name, 7); + CHANNEL_DEF* channel = freerdp_settings_get_pointer_array_writable( + settings, FreeRDP_ChannelDefArray, settings->ChannelCount); + strncpy(channel->name, pChannelDef->name, CHANNEL_NAME_LEN); channel->options = pChannelDef->options; settings->ChannelCount++; } @@ -928,8 +930,9 @@ static UINT VCAPITYPE FreeRDP_VirtualChannelInit(LPVOID* ppInitHandle, PCHANNEL_ if (settings->ChannelCount < CHANNEL_MAX_COUNT) { - channel = &settings->ChannelDefArray[settings->ChannelCount]; - strncpy(channel->name, pChannelDef->name, 7); + channel = freerdp_settings_get_pointer_array_writable(settings, FreeRDP_ChannelDefArray, + settings->ChannelCount); + strncpy(channel->name, pChannelDef->name, CHANNEL_NAME_LEN); channel->options = pChannelDef->options; settings->ChannelCount++; } diff --git a/libfreerdp/core/client.h b/libfreerdp/core/client.h index 750b32d7a..592f52b27 100644 --- a/libfreerdp/core/client.h +++ b/libfreerdp/core/client.h @@ -22,6 +22,7 @@ #include #include +#include #include #include @@ -52,7 +53,7 @@ typedef struct rdp_channel_client_data CHANNEL_CLIENT_DATA; struct rdp_channel_open_data { - char name[8]; + char name[CHANNEL_NAME_LEN + 1]; int OpenHandle; int options; int flags; diff --git a/libfreerdp/core/connection.c b/libfreerdp/core/connection.c index 712156f77..42d45fae0 100644 --- a/libfreerdp/core/connection.c +++ b/libfreerdp/core/connection.c @@ -908,7 +908,8 @@ BOOL rdp_client_connect_mcs_channel_join_confirm(rdpRdp* rdp, wStream* s) { if (mcs->channelCount > 0) { - if (!mcs_send_channel_join_request(mcs, mcs->channels[0].ChannelId)) + const rdpMcsChannel* cur = &mcs->channels[0]; + if (!mcs_send_channel_join_request(mcs, cur->ChannelId)) return FALSE; allJoined = FALSE; @@ -924,7 +925,8 @@ BOOL rdp_client_connect_mcs_channel_join_confirm(rdpRdp* rdp, wStream* s) if (mcs->channelCount > 0) { - if (!mcs_send_channel_join_request(mcs, mcs->channels[0].ChannelId)) + const rdpMcsChannel* cur = &mcs->channels[0]; + if (!mcs_send_channel_join_request(mcs, cur->ChannelId)) return FALSE; allJoined = FALSE; @@ -934,19 +936,21 @@ BOOL rdp_client_connect_mcs_channel_join_confirm(rdpRdp* rdp, wStream* s) { for (i = 0; i < mcs->channelCount; i++) { - if (mcs->channels[i].joined) + rdpMcsChannel* cur = &mcs->channels[i]; + if (cur->joined) continue; - if (mcs->channels[i].ChannelId != channelId) + if (cur->ChannelId != channelId) return FALSE; - mcs->channels[i].joined = TRUE; + cur->joined = TRUE; break; } if (i + 1 < mcs->channelCount) { - if (!mcs_send_channel_join_request(mcs, mcs->channels[i + 1].ChannelId)) + const rdpMcsChannel* cur = &mcs->channels[i + 1]; + if (!mcs_send_channel_join_request(mcs, cur->ChannelId)) return FALSE; allJoined = FALSE; @@ -1327,7 +1331,8 @@ BOOL rdp_server_accept_mcs_connect_initial(rdpRdp* rdp, wStream* s) for (i = 0; i < mcs->channelCount; i++) { - WLog_INFO(TAG, " %s", mcs->channels[i].Name); + rdpMcsChannel* cur = &mcs->channels[i]; + WLog_INFO(TAG, " %s", cur->Name); } if (!mcs_send_connect_response(mcs)) @@ -1380,10 +1385,11 @@ BOOL rdp_server_accept_mcs_channel_join_request(rdpRdp* rdp, wStream* s) for (i = 0; i < mcs->channelCount; i++) { - if (mcs->channels[i].ChannelId == channelId) - mcs->channels[i].joined = TRUE; + rdpMcsChannel* cur = &mcs->channels[i]; + if (cur->ChannelId == channelId) + cur->joined = TRUE; - if (!mcs->channels[i].joined) + if (!cur->joined) allJoined = FALSE; } diff --git a/libfreerdp/core/gcc.c b/libfreerdp/core/gcc.c index 9e2c5e0b7..6e76358fa 100644 --- a/libfreerdp/core/gcc.c +++ b/libfreerdp/core/gcc.c @@ -1584,9 +1584,10 @@ BOOL gcc_read_client_network_data(wStream* s, rdpMcs* mcs, UINT16 blockLength) * of seven ANSI characters that uniquely identify the channel. * - options: a 32-bit, unsigned integer. Channel option flags */ - Stream_Read(s, mcs->channels[i].Name, 8); /* name (8 bytes) */ + rdpMcsChannel* channel = &mcs->channels[i]; + Stream_Read(s, channel->Name, CHANNEL_NAME_LEN + 1); /* name (8 bytes) */ - if (!memchr(mcs->channels[i].Name, 0, 8)) + if (!memchr(channel->Name, 0, CHANNEL_NAME_LEN + 1)) { WLog_ERR( TAG, @@ -1594,8 +1595,8 @@ BOOL gcc_read_client_network_data(wStream* s, rdpMcs* mcs, UINT16 blockLength) return FALSE; } - Stream_Read_UINT32(s, mcs->channels[i].options); /* options (4 bytes) */ - mcs->channels[i].ChannelId = mcs->baseChannelId++; + Stream_Read_UINT32(s, channel->options); /* options (4 bytes) */ + channel->ChannelId = mcs->baseChannelId++; } return TRUE; @@ -1624,8 +1625,9 @@ BOOL gcc_write_client_network_data(wStream* s, const rdpMcs* mcs) for (i = 0; i < mcs->channelCount; i++) { /* CHANNEL_DEF */ - Stream_Write(s, mcs->channels[i].Name, 8); /* name (8 bytes) */ - Stream_Write_UINT32(s, mcs->channels[i].options); /* options (4 bytes) */ + rdpMcsChannel* channel = &mcs->channels[i]; + Stream_Write(s, channel->Name, CHANNEL_NAME_LEN + 1); /* name (8 bytes) */ + Stream_Write_UINT32(s, channel->options); /* options (4 bytes) */ } } return TRUE; @@ -1662,8 +1664,9 @@ BOOL gcc_read_server_network_data(wStream* s, rdpMcs* mcs) for (i = 0; i < parsedChannelCount; i++) { + rdpMcsChannel* channel = &mcs->channels[i]; Stream_Read_UINT16(s, channelId); /* channelId */ - mcs->channels[i].ChannelId = channelId; + channel->ChannelId = channelId; } if (channelCount % 2 == 1) @@ -1685,7 +1688,8 @@ BOOL gcc_write_server_network_data(wStream* s, const rdpMcs* mcs) for (i = 0; i < mcs->channelCount; i++) { - Stream_Write_UINT16(s, mcs->channels[i].ChannelId); + const rdpMcsChannel* channel = &mcs->channels[i]; + Stream_Write_UINT16(s, channel->ChannelId); } if (mcs->channelCount % 2 == 1) diff --git a/libfreerdp/core/listener.c b/libfreerdp/core/listener.c index ecb96699c..af78cde4a 100644 --- a/libfreerdp/core/listener.c +++ b/libfreerdp/core/listener.c @@ -295,16 +295,49 @@ static DWORD freerdp_listener_get_event_handles(freerdp_listener* instance, HAND return listener->num_sockfds; } +BOOL freerdp_peer_set_local_and_hostname(freerdp_peer* client, + const struct sockaddr_storage* peer_addr) +{ + void* sin_addr = NULL; + const BYTE localhost6_bytes[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }; + + WINPR_ASSERT(client); + WINPR_ASSERT(peer_addr); + + if (peer_addr->ss_family == AF_INET) + { + sin_addr = &(((struct sockaddr_in*)&peer_addr)->sin_addr); + + if ((*(UINT32*)sin_addr) == 0x0100007f) + client->local = TRUE; + } + else if (peer_addr->ss_family == AF_INET6) + { + sin_addr = &(((struct sockaddr_in6*)&peer_addr)->sin6_addr); + + if (memcmp(sin_addr, localhost6_bytes, 16) == 0) + client->local = TRUE; + } + +#ifndef _WIN32 + else if (peer_addr->ss_family == AF_UNIX) + client->local = TRUE; +#endif + + if (sin_addr) + inet_ntop(peer_addr->ss_family, sin_addr, client->hostname, sizeof(client->hostname)); + + return TRUE; +} + static BOOL freerdp_listener_check_fds(freerdp_listener* instance) { int i; - void* sin_addr; int peer_sockfd; freerdp_peer* client = NULL; int peer_addr_size; struct sockaddr_storage peer_addr; rdpListener* listener = (rdpListener*)instance->listener; - static const BYTE localhost6_bytes[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }; BOOL peer_accepted; if (listener->num_sockfds < 1) @@ -345,31 +378,12 @@ static BOOL freerdp_listener_check_fds(freerdp_listener* instance) return FALSE; } - sin_addr = NULL; - - if (peer_addr.ss_family == AF_INET) + if (!freerdp_peer_set_local_and_hostname(client, &peer_addr)) { - sin_addr = &(((struct sockaddr_in*)&peer_addr)->sin_addr); - - if ((*(UINT32*)sin_addr) == 0x0100007f) - client->local = TRUE; + closesocket((SOCKET)peer_sockfd); + freerdp_peer_free(client); + return FALSE; } - else if (peer_addr.ss_family == AF_INET6) - { - sin_addr = &(((struct sockaddr_in6*)&peer_addr)->sin6_addr); - - if (memcmp(sin_addr, localhost6_bytes, 16) == 0) - client->local = TRUE; - } - -#ifndef _WIN32 - else if (peer_addr.ss_family == AF_UNIX) - client->local = TRUE; - -#endif - - if (sin_addr) - inet_ntop(peer_addr.ss_family, sin_addr, client->hostname, sizeof(client->hostname)); IFCALLRET(instance->PeerAccepted, peer_accepted, instance, client); diff --git a/libfreerdp/core/mcs.c b/libfreerdp/core/mcs.c index 6baa0f77a..0554d3ae3 100644 --- a/libfreerdp/core/mcs.c +++ b/libfreerdp/core/mcs.c @@ -218,8 +218,12 @@ static int mcs_initialize_client_channels(rdpMcs* mcs, rdpSettings* settings) for (index = 0; index < mcs->channelCount; index++) { - CopyMemory(mcs->channels[index].Name, settings->ChannelDefArray[index].name, 8); - mcs->channels[index].options = settings->ChannelDefArray[index].options; + const CHANNEL_DEF* defchannel = + freerdp_settings_get_pointer_array(settings, FreeRDP_ChannelDefArray, index); + rdpMcsChannel* cur = &mcs->channels[index]; + WINPR_ASSERT(defchannel); + CopyMemory(cur->Name, defchannel->name, CHANNEL_NAME_LEN); + cur->options = defchannel->options; } return 0; diff --git a/libfreerdp/core/mcs.h b/libfreerdp/core/mcs.h index 8c030a139..057a2a16f 100644 --- a/libfreerdp/core/mcs.h +++ b/libfreerdp/core/mcs.h @@ -31,6 +31,7 @@ typedef struct rdp_mcs rdpMcs; #include #include +#include #define MCS_BASE_CHANNEL_ID 1001 #define MCS_GLOBAL_CHANNEL_ID 1003 @@ -118,7 +119,7 @@ typedef struct struct rdp_mcs_channel { - char Name[8]; + char Name[CHANNEL_NAME_LEN + 1]; UINT32 options; int ChannelId; BOOL joined; diff --git a/libfreerdp/core/server.c b/libfreerdp/core/server.c index 787a128cc..66bbafd73 100644 --- a/libfreerdp/core/server.c +++ b/libfreerdp/core/server.c @@ -67,13 +67,16 @@ static rdpPeerChannel* wts_get_dvc_channel_by_id(WTSVirtualChannelManager* vcm, int count; BOOL found = FALSE; rdpPeerChannel* channel = NULL; + + WINPR_ASSERT(vcm); + ArrayList_Lock(vcm->dynamicVirtualChannels); count = ArrayList_Count(vcm->dynamicVirtualChannels); for (index = 0; index < count; index++) { channel = (rdpPeerChannel*)ArrayList_GetItem(vcm->dynamicVirtualChannels, index); - + WINPR_ASSERT(channel); if (channel->channelId == ChannelId) { found = TRUE; @@ -89,6 +92,8 @@ static BOOL wts_queue_receive_data(rdpPeerChannel* channel, const BYTE* Buffer, { BYTE* buffer; wtsChannelMessage* messageCtx; + + WINPR_ASSERT(channel); messageCtx = (wtsChannelMessage*)malloc(sizeof(wtsChannelMessage) + Length); if (!messageCtx) @@ -107,6 +112,8 @@ static BOOL wts_queue_send_item(rdpPeerChannel* channel, BYTE* Buffer, UINT32 Le BYTE* buffer; UINT32 length; UINT16 channelId; + WINPR_ASSERT(channel); + WINPR_ASSERT(channel->vcm); buffer = Buffer; length = Length; channelId = channel->channelId; @@ -116,6 +123,8 @@ static BOOL wts_queue_send_item(rdpPeerChannel* channel, BYTE* Buffer, UINT32 Le static int wts_read_variable_uint(wStream* s, int cbLen, UINT32* val) { + WINPR_ASSERT(s); + WINPR_ASSERT(val); switch (cbLen) { case 0: @@ -145,6 +154,8 @@ static BOOL wts_read_drdynvc_capabilities_response(rdpPeerChannel* channel, UINT { UINT16 Version; + WINPR_ASSERT(channel); + WINPR_ASSERT(channel->vcm); if (length < 3) return FALSE; @@ -159,6 +170,8 @@ static BOOL wts_read_drdynvc_create_response(rdpPeerChannel* channel, wStream* s { UINT32 CreationStatus; + WINPR_ASSERT(channel); + WINPR_ASSERT(s); if (length < 4) return FALSE; @@ -183,6 +196,8 @@ static BOOL wts_read_drdynvc_data_first(rdpPeerChannel* channel, wStream* s, int UINT32 length) { int value; + WINPR_ASSERT(channel); + WINPR_ASSERT(s); value = wts_read_variable_uint(s, cbLen, &channel->dvc_total_length); if (value == 0) @@ -206,6 +221,8 @@ static BOOL wts_read_drdynvc_data(rdpPeerChannel* channel, wStream* s, UINT32 le { BOOL ret = FALSE; + WINPR_ASSERT(channel); + WINPR_ASSERT(s); if (channel->dvc_total_length > 0) { if (Stream_GetPosition(channel->receiveData) + length > channel->dvc_total_length) @@ -236,6 +253,7 @@ static BOOL wts_read_drdynvc_data(rdpPeerChannel* channel, wStream* s, UINT32 le static void wts_read_drdynvc_close_response(rdpPeerChannel* channel) { + WINPR_ASSERT(channel); DEBUG_DVC("ChannelId %" PRIu32 " close response", channel->channelId); channel->dvc_open_state = DVC_OPEN_STATE_CLOSED; MessageQueue_PostQuit(channel->queue, 0); @@ -250,6 +268,10 @@ static BOOL wts_read_drdynvc_pdu(rdpPeerChannel* channel) int cbChId; UINT32 ChannelId; rdpPeerChannel* dvc; + + WINPR_ASSERT(channel); + WINPR_ASSERT(channel->vcm); + length = Stream_GetPosition(channel->receiveData); if (length < 1) @@ -316,6 +338,7 @@ static int wts_write_variable_uint(wStream* s, UINT32 val) { int cb; + WINPR_ASSERT(s); if (val <= 0xFF) { cb = 0; @@ -339,6 +362,9 @@ static void wts_write_drdynvc_header(wStream* s, BYTE Cmd, UINT32 ChannelId) { BYTE* bm; int cbChId; + + WINPR_ASSERT(s); + Stream_GetPointer(s, bm); Stream_Seek_UINT8(s); cbChId = wts_write_variable_uint(s, ChannelId); @@ -348,6 +374,10 @@ static void wts_write_drdynvc_header(wStream* s, BYTE Cmd, UINT32 ChannelId) static BOOL wts_write_drdynvc_create_request(wStream* s, UINT32 ChannelId, const char* ChannelName) { size_t len; + + WINPR_ASSERT(s); + WINPR_ASSERT(ChannelName); + wts_write_drdynvc_header(s, CREATE_REQUEST_PDU, ChannelId); len = strlen(ChannelName) + 1; @@ -365,6 +395,8 @@ static BOOL WTSProcessChannelData(rdpPeerChannel* channel, UINT16 channelId, con const size_t size = (size_t)s; const size_t totalSize = (size_t)t; + WINPR_ASSERT(channel); + WINPR_ASSERT(channel->vcm); WINPR_UNUSED(channelId); if (flags & CHANNEL_FLAG_FIRST) @@ -404,13 +436,20 @@ static BOOL WTSReceiveChannelData(freerdp_peer* client, UINT16 channelId, const size_t size, UINT32 flags, size_t totalSize) { UINT32 i; - rdpMcs* mcs = client->context->rdp->mcs; + rdpMcs* mcs; + + WINPR_ASSERT(client); + WINPR_ASSERT(client->context); + WINPR_ASSERT(client->context->rdp); + mcs = client->context->rdp->mcs; + WINPR_ASSERT(mcs); for (i = 0; i < mcs->channelCount; i++) { - if (mcs->channels[i].ChannelId == channelId) + rdpMcsChannel* cur = &mcs->channels[i]; + if (cur->ChannelId == channelId) { - rdpPeerChannel* channel = (rdpPeerChannel*)mcs->channels[i].handle; + rdpPeerChannel* channel = (rdpPeerChannel*)cur->handle; if (channel) return WTSProcessChannelData(channel, channelId, data, size, flags, totalSize); @@ -426,6 +465,10 @@ void WTSVirtualChannelManagerGetFileDescriptor(HANDLE hServer, void** fds, int* { void* fd; WTSVirtualChannelManager* vcm = (WTSVirtualChannelManager*)hServer; + WINPR_ASSERT(vcm); + WINPR_ASSERT(fds); + WINPR_ASSERT(fds_count); + fd = GetEventWaitObject(MessageQueue_Event(vcm->queue)); if (fd) @@ -455,6 +498,8 @@ static BOOL WTSVirtualChannelManagerOpen(WTSVirtualChannelManager* vcm) if (!vcm) return FALSE; + WINPR_ASSERT(vcm->client); + if ((vcm->drdynvc_state == DRDYNVC_STATE_NONE) && vcm->client->activated) { rdpPeerChannel* channel; @@ -527,6 +572,7 @@ BOOL WTSVirtualChannelManagerCheckFileDescriptor(HANDLE hServer) HANDLE WTSVirtualChannelManagerGetEventHandle(HANDLE hServer) { WTSVirtualChannelManager* vcm = (WTSVirtualChannelManager*)hServer; + WINPR_ASSERT(vcm); return MessageQueue_Event(vcm->queue); } @@ -534,16 +580,16 @@ static rdpMcsChannel* wts_get_joined_channel_by_name(rdpMcs* mcs, const char* ch { UINT32 index; - if (!mcs || !channel_name || !strnlen(channel_name, CHANNEL_NAME_LEN)) + if (!mcs || !channel_name || !strnlen(channel_name, CHANNEL_NAME_LEN + 1)) return NULL; for (index = 0; index < mcs->channelCount; index++) { - if (mcs->channels[index].joined) + rdpMcsChannel* mchannel = &mcs->channels[index]; + if (mchannel->joined) { - if (_strnicmp(mcs->channels[index].Name, channel_name, - strnlen(channel_name, CHANNEL_NAME_LEN)) == 0) - return &mcs->channels[index]; + if (_strnicmp(mchannel->Name, channel_name, CHANNEL_NAME_LEN + 1) == 0) + return mchannel; } } @@ -557,11 +603,13 @@ static rdpMcsChannel* wts_get_joined_channel_by_id(rdpMcs* mcs, const UINT16 cha if (!mcs || !channel_id) return NULL; + WINPR_ASSERT(mcs->channels); for (index = 0; index < mcs->channelCount; index++) { - if (mcs->channels[index].joined) + rdpMcsChannel* mchannel = &mcs->channels[index]; + if (mchannel->joined) { - if (mcs->channels[index].ChannelId == channel_id) + if (mchannel->ChannelId == channel_id) return &mcs->channels[index]; } } @@ -600,6 +648,7 @@ BOOL WTSVirtualChannelManagerIsChannelJoined(HANDLE hServer, const char* name) BYTE WTSVirtualChannelManagerGetDrdynvcState(HANDLE hServer) { WTSVirtualChannelManager* vcm = (WTSVirtualChannelManager*)hServer; + WINPR_ASSERT(vcm); return vcm->drdynvc_state; } @@ -607,6 +656,7 @@ UINT16 WTSChannelGetId(freerdp_peer* client, const char* channel_name) { rdpMcsChannel* channel; + WINPR_ASSERT(channel_name); if (!client || !client->context || !client->context->rdp) return 0; @@ -622,6 +672,7 @@ BOOL WTSChannelSetHandleByName(freerdp_peer* client, const char* channel_name, v { rdpMcsChannel* channel; + WINPR_ASSERT(channel_name); if (!client || !client->context || !client->context->rdp) return FALSE; @@ -654,6 +705,7 @@ void* WTSChannelGetHandleByName(freerdp_peer* client, const char* channel_name) { rdpMcsChannel* channel; + WINPR_ASSERT(channel_name); if (!client || !client->context || !client->context->rdp) return NULL; @@ -704,7 +756,9 @@ char** WTSGetAcceptedChannelNames(freerdp_peer* client, size_t* count) if (!client || !client->context || !count) return NULL; + WINPR_ASSERT(client->context->rdp); mcs = client->context->rdp->mcs; + WINPR_ASSERT(mcs); *count = mcs->channelCount; names = (char**)calloc(mcs->channelCount, sizeof(char*)); @@ -712,7 +766,10 @@ char** WTSGetAcceptedChannelNames(freerdp_peer* client, size_t* count) return NULL; for (index = 0; index < mcs->channelCount; index++) - names[index] = mcs->channels[index].Name; + { + rdpMcsChannel* mchannel = &mcs->channels[index]; + names[index] = mchannel->Name; + } return names; } @@ -1068,6 +1125,9 @@ static rdpPeerChannel* channel_new(WTSVirtualChannelManager* vcm, freerdp_peer* wObject queueCallbacks = { 0 }; rdpPeerChannel* channel = (rdpPeerChannel*)calloc(1, sizeof(rdpPeerChannel)); + WINPR_ASSERT(vcm); + WINPR_ASSERT(client); + if (!channel) goto fail; @@ -1098,7 +1158,7 @@ HANDLE WINAPI FreeRDP_WTSVirtualChannelOpen(HANDLE hServer, DWORD SessionId, LPS size_t length; UINT32 index; rdpMcs* mcs; - BOOL joined = FALSE; + rdpMcsChannel* joined_channel = NULL; freerdp_peer* client; rdpPeerChannel* channel; WTSVirtualChannelManager* vcm; @@ -1123,31 +1183,31 @@ HANDLE WINAPI FreeRDP_WTSVirtualChannelOpen(HANDLE hServer, DWORD SessionId, LPS for (index = 0; index < mcs->channelCount; index++) { - if (mcs->channels[index].joined && - (strncmp(mcs->channels[index].Name, pVirtualName, length) == 0)) + rdpMcsChannel* mchannel = &mcs->channels[index]; + if (mchannel->joined && (strncmp(mchannel->Name, pVirtualName, length) == 0)) { - joined = TRUE; + joined_channel = mchannel; break; } } - if (!joined) + if (!joined_channel) { SetLastError(ERROR_NOT_FOUND); return NULL; } - channel = (rdpPeerChannel*)mcs->channels[index].handle; + channel = (rdpPeerChannel*)joined_channel->handle; if (!channel) { - channel = channel_new(vcm, client, mcs->channels[index].ChannelId, index, + channel = channel_new(vcm, client, joined_channel->ChannelId, index, RDP_PEER_CHANNEL_TYPE_SVC, client->settings->VirtualChannelChunkSize); if (!channel) goto fail; - mcs->channels[index].handle = channel; + joined_channel->handle = channel; } hChannelHandle = (HANDLE)channel; @@ -1188,7 +1248,8 @@ HANDLE WINAPI FreeRDP_WTSVirtualChannelOpenEx(DWORD SessionId, LPSTR pVirtualNam for (index = 0; index < mcs->channelCount; index++) { - if (mcs->channels[index].joined && (strncmp(mcs->channels[index].Name, "drdynvc", 7) == 0)) + rdpMcsChannel* mchannel = &mcs->channels[index]; + if (mchannel->joined && (strncmp(mchannel->Name, "drdynvc", CHANNEL_NAME_LEN + 1) == 0)) { joined = TRUE; break; @@ -1248,19 +1309,27 @@ BOOL WINAPI FreeRDP_WTSVirtualChannelClose(HANDLE hChannelHandle) { wStream* s; rdpMcs* mcs; - WTSVirtualChannelManager* vcm; + rdpPeerChannel* channel = (rdpPeerChannel*)hChannelHandle; BOOL ret = TRUE; if (channel) { - vcm = channel->vcm; + WTSVirtualChannelManager* vcm = channel->vcm; + + WINPR_ASSERT(vcm); + WINPR_ASSERT(vcm->client); + WINPR_ASSERT(vcm->client->context); + WINPR_ASSERT(vcm->client->context->rdp); mcs = vcm->client->context->rdp->mcs; if (channel->channelType == RDP_PEER_CHANNEL_TYPE_SVC) { if (channel->index < mcs->channelCount) - mcs->channels[channel->index].handle = NULL; + { + rdpMcsChannel* cur = &mcs->channels[channel->index]; + cur->handle = NULL; + } } else { @@ -1309,6 +1378,8 @@ BOOL WINAPI FreeRDP_WTSVirtualChannelRead(HANDLE hChannelHandle, ULONG TimeOut, wtsChannelMessage* messageCtx; rdpPeerChannel* channel = (rdpPeerChannel*)hChannelHandle; + WINPR_ASSERT(channel); + if (!MessageQueue_Peek(channel->queue, &message, FALSE)) { SetLastError(ERROR_NO_DATA); @@ -1361,6 +1432,7 @@ BOOL WINAPI FreeRDP_WTSVirtualChannelWrite(HANDLE hChannelHandle, PCHAR Buffer, if (!channel) return FALSE; + WINPR_ASSERT(channel->vcm); if (channel->channelType == RDP_PEER_CHANNEL_TYPE_SVC) { length = Length; @@ -1384,7 +1456,8 @@ BOOL WINAPI FreeRDP_WTSVirtualChannelWrite(HANDLE hChannelHandle, PCHAR Buffer, else { first = TRUE; - + WINPR_ASSERT(channel->client); + WINPR_ASSERT(channel->client->settings); while (Length > 0) { s = Stream_New(NULL, channel->client->settings->VirtualChannelChunkSize); @@ -1447,12 +1520,14 @@ BOOL WINAPI FreeRDP_WTSVirtualChannelQuery(HANDLE hChannelHandle, WTS_VIRTUAL_CL { void* pfd; BOOL bval; - void* fds[10]; + void* fds[10] = { 0 }; HANDLE hEvent; int fds_count = 0; BOOL status = FALSE; rdpPeerChannel* channel = (rdpPeerChannel*)hChannelHandle; - ZeroMemory(fds, sizeof(fds)); + + WINPR_ASSERT(channel); + hEvent = MessageQueue_Event(channel->queue); switch ((UINT32)WtsVirtualClass) diff --git a/server/Sample/sfreerdp.c b/server/Sample/sfreerdp.c index 52600db3b..e0ba9f202 100644 --- a/server/Sample/sfreerdp.c +++ b/server/Sample/sfreerdp.c @@ -791,12 +791,9 @@ static DWORD WINAPI test_peer_mainloop(LPVOID arg) } /* Initialize the real server settings here */ - client->settings->CertificateFile = _strdup("server.crt"); - client->settings->PrivateKeyFile = _strdup("server.key"); - client->settings->RdpKeyFile = _strdup("server.key"); - - if (!client->settings->CertificateFile || !client->settings->PrivateKeyFile || - !client->settings->RdpKeyFile) + if (!freerdp_settings_set_string(client->settings, FreeRDP_CertificateFile, "server.crt") || + !freerdp_settings_set_string(client->settings, FreeRDP_PrivateKeyFile, "server.key") || + !freerdp_settings_set_string(client->settings, FreeRDP_RdpKeyFile, "server.key")) { WLog_ERR(TAG, "Memory allocation failed (strdup)"); freerdp_peer_free(client); diff --git a/server/shadow/shadow_client.c b/server/shadow/shadow_client.c index 4c8acff1c..be9e3d741 100644 --- a/server/shadow/shadow_client.c +++ b/server/shadow/shadow_client.c @@ -195,13 +195,13 @@ static BOOL shadow_client_context_new(freerdp_peer* peer, rdpContext* context) settings->DrawAllowDynamicColorFidelity = TRUE; settings->CompressionLevel = PACKET_COMPR_TYPE_RDP6; - if (!(settings->CertificateFile = _strdup(server->CertificateFile))) + if (!freerdp_settings_set_string(settings, FreeRDP_CertificateFile, server->CertificateFile)) goto fail_cert_file; - if (!(settings->PrivateKeyFile = _strdup(server->PrivateKeyFile))) + if (!freerdp_settings_set_string(settings, FreeRDP_PrivateKeyFile, server->PrivateKeyFile)) goto fail_privkey_file; - if (!(settings->RdpKeyFile = _strdup(settings->PrivateKeyFile))) + if (!freerdp_settings_set_string(settings, FreeRDP_RdpKeyFile, server->PrivateKeyFile)) goto fail_rdpkey_file; if (server->ipcSocket && (strncmp(bind_address, server->ipcSocket, strnlen(bind_address, sizeof(bind_address))) != 0)) @@ -243,14 +243,11 @@ fail_message_queue: fail_open_server: DeleteCriticalSection(&(client->lock)); fail_client_lock: - free(settings->RdpKeyFile); - settings->RdpKeyFile = NULL; + freerdp_settings_set_string(settings, FreeRDP_RdpKeyFile, NULL); fail_rdpkey_file: - free(settings->PrivateKeyFile); - settings->PrivateKeyFile = NULL; + freerdp_settings_set_string(settings, FreeRDP_PrivateKeyFile, NULL); fail_privkey_file: - free(settings->CertificateFile); - settings->CertificateFile = NULL; + freerdp_settings_set_string(settings, FreeRDP_CertificateFile, NULL); fail_cert_file: return FALSE; }