ole32 : wrong check in compobj.c
Robert Shearman
rob at codeweavers.com
Mon Jan 10 11:02:51 CST 2005
Paul Vriens wrote:
>Hi,
>
>while looking through the code I saw:
>
>if (model & COINIT_MULTITHREADED)
>
>this will never work as COINIT_MULTITHREADED = 0.
>
>
Good catch.
>The attached patch fixes the 3 occurrences of a check against COINIT_*.
>
>This patch however makes the COM_CreateApartment in compobj.c:
>
> 545 if (!(apt = COM_CurrentInfo()->apt))
> 546 {
> 547 apt = COM_CreateApartment(dwCoInit);
> 548 if (!apt) return E_OUTOFMEMORY;
> 549 }
>
>return E_OUTOFMEMORY, always (?). And that makes sure that we have
>a mismatch between CoInitialize and CoUninitialize.
>
>So there's definitely something else wrong as well.
>
>Any idea ?
>
>
The parameter to CoInitializeEx is of type COINIT and so the caller can also specify another flag like COINIT_DISABLE_OLE1DDE along with the apartment flag.
So we either need to convert the values to booleans before we call the lower level COM_CreateApartment or we need to be more careful and change the comparisons to this:
if ((dwCoInit & (COINIT_APARTMENTTHREADED|COINIT_MULTITHREADED) == COINIT_MULTITHREADED) ...
>------------------------------------------------------------------------
>
>Index: dlls/ole32/compobj.c
>===================================================================
>RCS file: /home/wine/wine/dlls/ole32/compobj.c,v
>retrieving revision 1.121
>diff -u -r1.121 compobj.c
>--- dlls/ole32/compobj.c 6 Jan 2005 19:39:07 -0000 1.121
>+++ dlls/ole32/compobj.c 10 Jan 2005 16:41:00 -0000
>@@ -252,13 +252,13 @@
>
> if (!apt)
> {
>- if (model & COINIT_MULTITHREADED)
>+ if (model == COINIT_MULTITHREADED)
> {
> TRACE("thread 0x%lx is entering the multithreaded apartment\n", GetCurrentThreadId());
> COM_CurrentInfo()->apt = &MTA;
> return apt;
> }
>-
>+
> TRACE("creating new apartment, model=%ld\n", model);
>
> apt = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(APARTMENT));
>@@ -277,7 +277,7 @@
>
> /* we don't ref the apartment as CoInitializeEx will do it for us */
>
>- if (model & COINIT_APARTMENTTHREADED)
>+ if (model == COINIT_APARTMENTTHREADED)
> {
> /* FIXME: how does windoze create OXIDs? */
> apt->oxid = MTA.oxid | GetCurrentThreadId();
>@@ -316,7 +316,7 @@
>
> MARSHAL_Disconnect_Proxies(apt);
>
>- if ((apt->model & COINIT_APARTMENTTHREADED) && apt->win) DestroyWindow(apt->win);
>+ if ((apt->model == COINIT_APARTMENTTHREADED) && apt->win) DestroyWindow(apt->win);
>
>
This change can be simplified to just check for the non-null apt->win.
Rob
More information about the wine-devel
mailing list