combase: When looking up an apartment which has a given creator thread ID use multi-threaded apartment only if the thread doesn't have an apartment-threaded one.

CoIncrementMTAUsage() always creates the MTA if it doesn't already exist,
and mta->tid may accidently match the apt->tid of the apartment-threaded
apartment of the thread.

Signed-off-by: Dmitry Timoshkov <dmitry@baikal.ru>
Signed-off-by: Huw Davies <huw@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Dmitry Timoshkov 2021-07-29 19:18:27 +03:00 committed by Alexandre Julliard
parent 251ab17af7
commit b4da140357
1 changed files with 8 additions and 1 deletions

View File

@ -663,13 +663,20 @@ struct apartment * apartment_findfromtid(DWORD tid)
EnterCriticalSection(&apt_cs);
LIST_FOR_EACH_ENTRY(apt, &apts, struct apartment, entry)
{
if (apt->tid == tid)
if (apt != mta && apt->tid == tid)
{
result = apt;
apartment_addref(result);
break;
}
}
if (!result && mta && mta->tid == tid)
{
result = mta;
apartment_addref(result);
}
LeaveCriticalSection(&apt_cs);
return result;