[PATCH 3/3] ole32: Always grab a reference to apt in CoGetClassObject().

Huw Davies huw at codeweavers.com
Mon Apr 9 06:49:52 CDT 2018


On Thu, Mar 29, 2018 at 11:31:37AM +0100, Huw Davies wrote:
> On Wed, Mar 28, 2018 at 09:01:58PM -0500, Zebediah Figura wrote:
> > Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
> > ---
> > In a sense this is just to make the code simpler, but the problem it causes
> > would happen anyway. The basic problem is that destroying an apartment cleans
> > up its proxy manager, which calls proxy_manager_get_remunknown() in order to
> > release the IRemUnknown if it exists, and this may end up unmarshalling the
> > IRemUnknown, triggering calls to CoGetClassObject (as well as CoGetPSClsid()
> > etc.) Later it's also necessary to call apartment_get_current_or_mta() in
> > proxy_manager_get_remunknown() itself. As far as I understand we wouldn't tear
> > down the proxy manager from a different thread than the MTA was initialized
> > on, but we might call proxy_manager_get_remunknown() from a different thread,
> > so this is necessary.
> > 
> > Alternate solutions, I guess:
> > * Use the apartment's critical section instead. This seems existentially not
> >   quite appropriate, and it's not clear to me what all of the implications of
> >   this would be.
> > * Try to restructure where the apartment is grabbed.
> > * Perhaps don't even grab a reference to the MTA at all. This seems terrible
> >   on its face, but it also seems true that an app which closes the MTA while
> >   it's using an MTA object is pretty broken.
> > There is quite a lot of DCOM about, so I'd at least appreciate help in
> > determining whether this solution or any of the alternates is best.
> 
> This will need some thought.  I'll get back to you.

Ok, this looks reasonable.  Thanks for bearing with me.

Signed-off-by: Huw Davies <huw at codeweavers.com>



More information about the wine-devel mailing list