From 6be43d43c2f0574a8bf04ff4f4c18130050a9261 Mon Sep 17 00:00:00 2001 From: Bernhard Miklautz Date: Wed, 28 Dec 2016 12:05:01 +0100 Subject: [PATCH] Use common handle ids for all channels Channels with regular and extended interface need to live in the same handle name space otherwise they can't be uniquely identified in the global channel manager. --- libfreerdp/core/client.c | 15 ++++++--------- libfreerdp/core/client.h | 1 - 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/libfreerdp/core/client.c b/libfreerdp/core/client.c index cdc2e7f..4e0b346 100644 --- a/libfreerdp/core/client.c +++ b/libfreerdp/core/client.c @@ -34,9 +34,8 @@ static WINPR_TLS void* g_pInterface = NULL; static WINPR_TLS rdpChannels* g_channels = NULL; /* use only for VirtualChannelInit hack */ -static UINT32 g_OpenHandleSeq = - 1; /* use global counter to ensure uniqueness across channel manager instances */ -static rdpChannelHandles g_ChannelHandles = { NULL, NULL }; +static volatile LONG g_OpenHandleSeq = 1; /* use global counter to ensure uniqueness across channel manager instances */ +static WINPR_TLS rdpChannelHandles g_ChannelHandles = { NULL, NULL }; static CHANNEL_OPEN_DATA* freerdp_channels_find_channel_open_data_by_name( rdpChannels* channels, const char* name) @@ -600,7 +599,7 @@ static UINT VCAPITYPE FreeRDP_VirtualChannelInitEx(LPVOID lpUserParam, LPVOID cl { pChannelDef = &pChannel[index]; pChannelOpenData = &channels->openDataList[channels->openDataCount]; - pChannelOpenData->OpenHandle = ++channels->openHandleSequence; + pChannelOpenData->OpenHandle = InterlockedIncrement(&g_OpenHandleSeq); pChannelOpenData->channels = channels; pChannelOpenData->lpUserParam = lpUserParam; HashTable_Add(channels->openHandles, (void*)(UINT_PTR) pChannelOpenData->OpenHandle, @@ -630,7 +629,6 @@ static UINT VCAPITYPE FreeRDP_VirtualChannelInit(LPVOID* ppInitHandle, { INT index; void* pInterface; - DWORD OpenHandle; CHANNEL_DEF* channel; rdpSettings* settings; PCHANNEL_DEF pChannelDef; @@ -689,11 +687,10 @@ static UINT VCAPITYPE FreeRDP_VirtualChannelInit(LPVOID* ppInitHandle, { pChannelDef = &pChannel[index]; pChannelOpenData = &channels->openDataList[channels->openDataCount]; - OpenHandle = g_OpenHandleSeq++; - pChannelOpenData->OpenHandle = OpenHandle; + pChannelOpenData->OpenHandle = InterlockedIncrement(&g_OpenHandleSeq); pChannelOpenData->channels = channels; - freerdp_channel_add_open_handle_data(&g_ChannelHandles, OpenHandle, (void*) channels); - HashTable_Add(channels->openHandles, (void*)(UINT_PTR) OpenHandle, + freerdp_channel_add_open_handle_data(&g_ChannelHandles, pChannelOpenData->OpenHandle, (void*) channels); + HashTable_Add(channels->openHandles, (void*)(UINT_PTR) pChannelOpenData->OpenHandle, (void*) pChannelOpenData); pChannelOpenData->flags = 1; /* init */ strncpy(pChannelOpenData->name, pChannelDef->name, CHANNEL_NAME_LEN); diff --git a/libfreerdp/core/client.h b/libfreerdp/core/client.h index dc00d79..46900b7 100644 --- a/libfreerdp/core/client.h +++ b/libfreerdp/core/client.h @@ -111,7 +111,6 @@ struct rdp_channels DrdynvcClientContext* drdynvc; CRITICAL_SECTION channelsLock; - int openHandleSequence; wHashTable* openHandles; }; -- 2.7.4