Use common handle ids for all channels
authorBernhard Miklautz <bernhard.miklautz@thincast.com>
Wed, 28 Dec 2016 11:05:01 +0000 (12:05 +0100)
committerBernhard Miklautz <bernhard.miklautz@thincast.com>
Wed, 28 Dec 2016 11:05:01 +0000 (12:05 +0100)
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
libfreerdp/core/client.h

index cdc2e7f..4e0b346 100644 (file)
@@ -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);
index dc00d79..46900b7 100644 (file)
@@ -111,7 +111,6 @@ struct rdp_channels
        DrdynvcClientContext* drdynvc;
        CRITICAL_SECTION channelsLock;
 
-       int openHandleSequence;
        wHashTable* openHandles;
 };