Rob Shearman : ole32: COM_GetRegisteredClassObject should only retrieve objects that were registered in the current apartment .

Alexandre Julliard julliard at wine.codeweavers.com
Tue May 8 06:59:39 CDT 2007


Module: wine
Branch: master
Commit: 51f85a765b498ba79f0134b097924d4fd6cfb3d2
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=51f85a765b498ba79f0134b097924d4fd6cfb3d2

Author: Rob Shearman <rob at codeweavers.com>
Date:   Mon May  7 23:59:09 2007 +0100

ole32: COM_GetRegisteredClassObject should only retrieve objects that were registered in the current apartment.

---

 dlls/ole32/compobj.c       |   25 +++++++++++++++----------
 dlls/ole32/tests/compobj.c |    2 --
 2 files changed, 15 insertions(+), 12 deletions(-)

diff --git a/dlls/ole32/compobj.c b/dlls/ole32/compobj.c
index b9669f2..121b3fd 100644
--- a/dlls/ole32/compobj.c
+++ b/dlls/ole32/compobj.c
@@ -76,9 +76,9 @@ HINSTANCE OLE32_hInstance = 0; /* FIXME: make static ... */
  * TODO: Most of these things will have to be made thread-safe.
  */
 
-static HRESULT COM_GetRegisteredClassObject(REFCLSID rclsid, DWORD dwClsContext, LPUNKNOWN*  ppUnk);
+static HRESULT COM_GetRegisteredClassObject(struct apartment *apt, REFCLSID rclsid, DWORD dwClsContext, LPUNKNOWN*  ppUnk);
 static void COM_RevokeAllClasses(struct apartment *apt);
-static HRESULT get_inproc_class_object(HKEY hkeydll, REFCLSID rclsid, REFIID riid, void **ppv);
+static HRESULT get_inproc_class_object(APARTMENT *apt, HKEY hkeydll, REFCLSID rclsid, REFIID riid, void **ppv);
 
 static APARTMENT *MTA; /* protected by csApartment */
 static APARTMENT *MainApartment; /* the first STA apartment */
@@ -1583,6 +1583,7 @@ HRESULT WINAPI CoRegisterPSClsid(REFIID riid, REFCLSID rclsid)
  *                 reference count on this object.
  */
 static HRESULT COM_GetRegisteredClassObject(
+        struct apartment *apt,
 	REFCLSID    rclsid,
 	DWORD       dwClsContext,
 	LPUNKNOWN*  ppUnk)
@@ -1602,7 +1603,8 @@ static HRESULT COM_GetRegisteredClassObject(
     /*
      * Check if we have a match on the class ID and context.
      */
-    if ((dwClsContext & curClass->runContext) &&
+    if ((apt->oxid == curClass->apartment_id) &&
+        (dwClsContext & curClass->runContext) &&
         IsEqualGUID(&(curClass->classIdentifier), rclsid))
     {
       /*
@@ -1699,7 +1701,7 @@ HRESULT WINAPI CoRegisterClassObject(
    * First, check if the class is already registered.
    * If it is, this should cause an error.
    */
-  hr = COM_GetRegisteredClassObject(rclsid, dwClsContext, &foundObject);
+  hr = COM_GetRegisteredClassObject(apt, rclsid, dwClsContext, &foundObject);
   if (hr == S_OK) {
     if (flags & REGCLS_MULTIPLEUSE) {
       if (dwClsContext & CLSCTX_LOCAL_SERVER)
@@ -1867,7 +1869,8 @@ static void get_threading_model(HKEY key, LPWSTR value, DWORD len)
         value[0] = '\0';
 }
 
-static HRESULT get_inproc_class_object(HKEY hkeydll, REFCLSID rclsid, REFIID riid, void **ppv)
+static HRESULT get_inproc_class_object(APARTMENT *apt, HKEY hkeydll,
+                                       REFCLSID rclsid, REFIID riid, void **ppv)
 {
     static const WCHAR wszApartment[] = {'A','p','a','r','t','m','e','n','t',0};
     static const WCHAR wszFree[] = {'F','r','e','e',0};
@@ -1875,7 +1878,6 @@ static HRESULT get_inproc_class_object(HKEY hkeydll, REFCLSID rclsid, REFIID rii
     WCHAR dllpath[MAX_PATH+1];
     WCHAR threading_model[10 /* strlenW(L"apartment")+1 */];
     HRESULT hr;
-    APARTMENT *apt = COM_CurrentApt();
 
     get_threading_model(hkeydll, threading_model, ARRAYSIZE(threading_model));
     /* "Apartment" */
@@ -1991,6 +1993,7 @@ HRESULT WINAPI CoGetClassObject(
 {
     LPUNKNOWN	regClassObject;
     HRESULT	hres = E_UNEXPECTED;
+    APARTMENT  *apt;
 
     TRACE("\n\tCLSID:\t%s,\n\tIID:\t%s\n", debugstr_guid(rclsid), debugstr_guid(iid));
 
@@ -1999,7 +2002,8 @@ HRESULT WINAPI CoGetClassObject(
 
     *ppv = NULL;
 
-    if (!COM_CurrentApt())
+    apt = COM_CurrentApt();
+    if (!apt)
     {
         ERR("apartment not initialised\n");
         return CO_E_NOTINITIALIZED;
@@ -2014,7 +2018,8 @@ HRESULT WINAPI CoGetClassObject(
      * First, try and see if we can't match the class ID with one of the
      * registered classes.
      */
-    if (S_OK == COM_GetRegisteredClassObject(rclsid, dwClsContext, &regClassObject))
+    if (S_OK == COM_GetRegisteredClassObject(apt, rclsid, dwClsContext,
+                                             &regClassObject))
     {
       /* Get the required interface from the retrieved pointer. */
       hres = IUnknown_QueryInterface(regClassObject, iid, ppv);
@@ -2052,7 +2057,7 @@ HRESULT WINAPI CoGetClassObject(
 
         if (SUCCEEDED(hres))
         {
-            hres = get_inproc_class_object(hkey, rclsid, iid, ppv);
+            hres = get_inproc_class_object(apt, hkey, rclsid, iid, ppv);
             RegCloseKey(hkey);
         }
 
@@ -2082,7 +2087,7 @@ HRESULT WINAPI CoGetClassObject(
 
         if (SUCCEEDED(hres))
         {
-            hres = get_inproc_class_object(hkey, rclsid, iid, ppv);
+            hres = get_inproc_class_object(apt, hkey, rclsid, iid, ppv);
             RegCloseKey(hkey);
         }
 
diff --git a/dlls/ole32/tests/compobj.c b/dlls/ole32/tests/compobj.c
index e568fb4..d9d93a5 100644
--- a/dlls/ole32/tests/compobj.c
+++ b/dlls/ole32/tests/compobj.c
@@ -797,7 +797,6 @@ static void test_registered_object_thread_affinity(void)
     WaitForSingleObject(thread, INFINITE);
     GetExitCodeThread(thread, &exitcode);
     hr = exitcode;
-    todo_wine
     ok(hr == REGDB_E_CLASSNOTREG, "CoGetClassObject on inproc object "
        "registered in different thread should return REGDB_E_CLASSNOTREG "
        "instead of 0x%08x\n", hr);
@@ -811,7 +810,6 @@ static void test_registered_object_thread_affinity(void)
     WaitForSingleObject(thread, INFINITE);
     GetExitCodeThread(thread, &exitcode);
     hr = exitcode;
-    todo_wine
     ok(hr == S_OK, "CoRegisterClassObject with same CLSID but in different thread should return S_OK instead of 0x%08x\n", hr);
 
     hr = CoRevokeClassObject(cookie);




More information about the wine-cvs mailing list