[PATCH 7/10] ole32: Fix CoRevokeClassObject to return
RPC_E_WRONG_THREAD
if it was called from a different apartment than the one that called
CoRegisterClassObject.
Robert Shearman
rob at codeweavers.com
Mon May 7 18:00:41 CDT 2007
---
dlls/ole32/compobj.c | 21 +++++++++++++++++++--
dlls/ole32/tests/compobj.c | 2 --
2 files changed, 19 insertions(+), 4 deletions(-)
-------------- next part --------------
diff --git a/dlls/ole32/compobj.c b/dlls/ole32/compobj.c
index 86485f0..3fb3324 100644
--- a/dlls/ole32/compobj.c
+++ b/dlls/ole32/compobj.c
@@ -1809,9 +1809,17 @@ HRESULT WINAPI CoRevokeClassObject(
{
HRESULT hr = E_INVALIDARG;
RegisteredClass *curClass;
+ APARTMENT *apt;
TRACE("(%08x)\n",dwRegister);
+ apt = COM_CurrentApt();
+ if (!apt)
+ {
+ ERR("COM was not initialized\n");
+ return CO_E_NOTINITIALIZED;
+ }
+
EnterCriticalSection( &csRegisteredClassList );
LIST_FOR_EACH_ENTRY(curClass, &RegisteredClassList, RegisteredClass, entry)
@@ -1821,8 +1829,17 @@ HRESULT WINAPI CoRevokeClassObject(
*/
if (curClass->dwCookie == dwRegister)
{
- COM_RevokeRegisteredClassObject(curClass);
- hr = S_OK;
+ if (curClass->apartment_id == apt->oxid)
+ {
+ COM_RevokeRegisteredClassObject(curClass);
+ hr = S_OK;
+ }
+ else
+ {
+ ERR("called from wrong apartment, should be called from %s\n",
+ wine_dbgstr_longlong(curClass->apartment_id));
+ hr = RPC_E_WRONG_THREAD;
+ }
break;
}
}
diff --git a/dlls/ole32/tests/compobj.c b/dlls/ole32/tests/compobj.c
index 41f16d4..579249e 100644
--- a/dlls/ole32/tests/compobj.c
+++ b/dlls/ole32/tests/compobj.c
@@ -847,7 +847,6 @@ static void test_registered_object_threa
WaitForSingleObject(thread, INFINITE);
GetExitCodeThread(thread, &exitcode);
hr = exitcode;
- todo_wine
ok(hr == RPC_E_WRONG_THREAD, "CoRevokeClassObject called from different "
"thread to where registered should return RPC_E_WRONG_THREAD instead of 0x%08x\n", hr);
@@ -860,7 +859,6 @@ static void test_registered_object_threa
"thread should return S_OK instead of 0x%08x\n", hr);
hr = CoRevokeClassObject(cookie);
- todo_wine
ok_ole_success(hr, "CoRevokeClassObject");
CoUninitialize();
More information about the wine-patches
mailing list