From 7881ec762e6f9b51e24878f4c3ed5343a4e05509 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marc-Andr=C3=A9=20Moreau?= Date: Fri, 21 Nov 2014 15:10:39 -0500 Subject: [PATCH] server/shadow: avoid sending pointer updates when not active, fix remdesk leak --- channels/remdesk/server/remdesk_main.c | 2 ++ client/common/cmdline.c | 15 ++++++++++++++- include/freerdp/settings.h | 8 +++++++- server/shadow/shadow_client.c | 32 ++++++++++++++++++++++---------- 4 files changed, 45 insertions(+), 12 deletions(-) diff --git a/channels/remdesk/server/remdesk_main.c b/channels/remdesk/server/remdesk_main.c index 8cdc4ab..8e37e22 100644 --- a/channels/remdesk/server/remdesk_main.c +++ b/channels/remdesk/server/remdesk_main.c @@ -156,6 +156,8 @@ static int remdesk_send_ctl_version_info_pdu(RemdeskServerContext* context) remdesk_virtual_channel_write(context, s); + Stream_Free(s, TRUE); + return 1; } diff --git a/client/common/cmdline.c b/client/common/cmdline.c index f1f9640..a731c31 100644 --- a/client/common/cmdline.c +++ b/client/common/cmdline.c @@ -2077,11 +2077,24 @@ int freerdp_client_load_addins(rdpChannels* channels, rdpSettings* settings) } } + if (settings->LyncRdpMode) + { + settings->EncomspVirtualChannel = TRUE; + settings->RemdeskVirtualChannel = TRUE; + settings->CompressionEnabled = FALSE; + } + if (settings->RemoteAssistanceMode) { + settings->EncomspVirtualChannel = TRUE; + settings->RemdeskVirtualChannel = TRUE; + } + + if (settings->EncomspVirtualChannel) freerdp_client_load_static_channel_addin(channels, settings, "encomsp", settings); + + if (settings->RemdeskVirtualChannel) freerdp_client_load_static_channel_addin(channels, settings, "remdesk", settings); - } for (index = 0; index < settings->StaticChannelCount; index++) { diff --git a/include/freerdp/settings.h b/include/freerdp/settings.h index a53c14d..ca358f1 100644 --- a/include/freerdp/settings.h +++ b/include/freerdp/settings.h @@ -599,6 +599,9 @@ typedef struct _RDPDR_PARALLEL RDPDR_PARALLEL; #define FreeRDP_RemoteAssistancePassStub 1026 #define FreeRDP_RemoteAssistancePassword 1027 #define FreeRDP_RemoteAssistanceRCTicket 1028 +#define FreeRDP_EncomspVirtualChannel 1029 +#define FreeRDP_RemdeskVirtualChannel 1030 +#define FreeRDP_LyncRdpMode 1031 #define FreeRDP_TlsSecurity 1088 #define FreeRDP_NlaSecurity 1089 #define FreeRDP_RdpSecurity 1090 @@ -971,7 +974,10 @@ struct rdp_settings ALIGN64 char* RemoteAssistancePassStub; /* 1026 */ ALIGN64 char* RemoteAssistancePassword; /* 1027 */ ALIGN64 char* RemoteAssistanceRCTicket; /* 1028 */ - UINT64 padding1088[1088 - 1029]; /* 1029 */ + ALIGN64 BOOL EncomspVirtualChannel; /* 1029 */ + ALIGN64 BOOL RemdeskVirtualChannel; /* 1030 */ + ALIGN64 BOOL LyncRdpMode; /* 1031 */ + UINT64 padding1088[1088 - 1032]; /* 1032 */ /** * X.224 Connection Request/Confirm diff --git a/server/shadow/shadow_client.c b/server/shadow/shadow_client.c index a230509..30ab90e 100644 --- a/server/shadow/shadow_client.c +++ b/server/shadow/shadow_client.c @@ -67,6 +67,12 @@ void shadow_client_context_new(freerdp_peer* peer, rdpShadowClient* client) settings->RdpKeyFile = _strdup(settings->PrivateKeyFile); + if (server->ipcSocket) + { + settings->LyncRdpMode = TRUE; + settings->CompressionEnabled = FALSE; + } + client->inLobby = TRUE; client->mayView = server->mayView; client->mayInteract = server->mayInteract; @@ -839,12 +845,15 @@ int shadow_client_subsystem_process_message(rdpShadowClient* client, wMessage* m pointerPosition.xPos = msg->xPos; pointerPosition.yPos = msg->yPos; - if ((msg->xPos != client->pointerX) || (msg->yPos != client->pointerY)) + if (client->activated) { - IFCALL(update->pointer->PointerPosition, context, &pointerPosition); + if ((msg->xPos != client->pointerX) || (msg->yPos != client->pointerY)) + { + IFCALL(update->pointer->PointerPosition, context, &pointerPosition); - client->pointerX = msg->xPos; - client->pointerY = msg->yPos; + client->pointerX = msg->xPos; + client->pointerY = msg->yPos; + } } free(msg); @@ -869,14 +878,17 @@ int shadow_client_subsystem_process_message(rdpShadowClient* client, wMessage* m pointerCached.cacheIndex = pointerColor->cacheIndex; - shadow_client_convert_alpha_pointer_data(msg->pixels, msg->premultiplied, - msg->width, msg->height, pointerColor); + if (client->activated) + { + shadow_client_convert_alpha_pointer_data(msg->pixels, msg->premultiplied, + msg->width, msg->height, pointerColor); - IFCALL(update->pointer->PointerNew, context, &pointerNew); - IFCALL(update->pointer->PointerCached, context, &pointerCached); + IFCALL(update->pointer->PointerNew, context, &pointerNew); + IFCALL(update->pointer->PointerCached, context, &pointerCached); - free(pointerColor->xorMaskData); - free(pointerColor->andMaskData); + free(pointerColor->xorMaskData); + free(pointerColor->andMaskData); + } free(msg->pixels); free(msg); -- 2.7.4