[PATCH] ole32: Store proxy/stub CLSIDs per process, not per apartment.

Sebastian Lackner sebastian at fds-team.de
Tue Aug 1 16:40:40 CDT 2017


On 01.08.2017 23:27, Zebediah Figura wrote:
> @@ -1173,13 +1175,16 @@ DWORD apartment_release(struct apartment *apt)
>              stub_manager_int_release(stubmgr);
>          }
>  
> -        LIST_FOR_EACH_SAFE(cursor, cursor2, &apt->psclsids)
> +        LIST_FOR_EACH_SAFE(cursor, cursor2, &RegisteredPSCLSIDList)

Accessing a global list from multiple threads requires synchronization
(for example, using a CS to avoid conflicting access). Using apt->cs
is not sufficient because it might be a different one for each thread.
The same also applies to all other places where the list is used.

> @@ -1177,6 +1196,15 @@ static void test_CoRegisterPSClsid(void)
>      hr = CoRegisterPSClsid(&IID_IWineTest, &CLSID_WineTestPSFactoryBuffer);
>      ok_ole_success(hr, "CoRegisterPSClsid");
>  
> +    hr = CoGetPSClsid(&IID_IWineTest, &clsid);
> +    ok_ole_success(hr, "CoGetPSClsid");
> +    ok(IsEqualGUID(&clsid, &CLSID_WineTestPSFactoryBuffer), "expected %s, got %s\n",
> +                   wine_dbgstr_guid(&CLSID_WineTestPSFactoryBuffer), wine_dbgstr_guid(&clsid));
> +
> +    thread = CreateThread(NULL, 0, register_ps_clsid_thread, NULL, 0, &tid);
> +    ok(thread != NULL, "CreateThread failed with error %d\n", GetLastError());
> +    ok(!WaitForSingleObject(thread, 10000), "wait timed out\n");

The thread handle is leaked here. Also, it would be more convincing to
run the tests for both STA and MTA.



More information about the wine-devel mailing list