[PATCH] 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.

Dmitry Timoshkov dmitry at baikal.ru
Thu Jul 29 11:18:27 CDT 2021


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 at baikal.ru>
---
 dlls/combase/apartment.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/dlls/combase/apartment.c b/dlls/combase/apartment.c
index 108d6a71c5c..690bc69db1b 100644
--- a/dlls/combase/apartment.c
+++ b/dlls/combase/apartment.c
@@ -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;
-- 
2.31.1




More information about the wine-devel mailing list