[PATCH] riched20: Release both the inner and outer IRichEditOle interface (Valgrind).

Michael Stefaniuc mstefani at winehq.org
Wed Jan 30 13:47:58 CST 2019


Summary from the discussions on irc:

This just papers over the real bug.
CreateIRichEditOle() is doing COM aggregation wrong. It needs to return
the inner IUnknown when being aggregated.
Of course the call site that does aggregation needs to be updated
accordingly:
dlls/riched20/txtsrv.c:84:         if
(!CreateIRichEditOle(This->outer_unk, This->editor, (void
**)(&This->editor->reOle)))

Plus other rippling effects as this is a nice COM cleanup after all ;)

bye
	michael


On 1/30/19 11:35 AM, Sven Baars wrote:
> Signed-off-by: Sven Baars <sven.wine at gmail.com>
> ---
>  dlls/riched20/richole.c | 25 +++++++++++++++++++++----
>  1 file changed, 21 insertions(+), 4 deletions(-)
> 
> diff --git a/dlls/riched20/richole.c b/dlls/riched20/richole.c
> index dc1a3b8405..59204f54a9 100644
> --- a/dlls/riched20/richole.c
> +++ b/dlls/riched20/richole.c
> @@ -1006,21 +1006,38 @@ static HRESULT WINAPI
>  IRichEditOle_fnQueryInterface(IRichEditOle *me, REFIID riid, LPVOID *ppvObj)
>  {
>      IRichEditOleImpl *This = impl_from_IRichEditOle(me);
> -    return IUnknown_QueryInterface(This->outer_unk, riid, ppvObj);
> +    if (This->outer_unk)
> +        return IUnknown_QueryInterface(This->outer_unk, riid, ppvObj);
> +    else
> +        return IUnknown_QueryInterface(&This->IUnknown_inner, riid, ppvObj);
>  }
>  
>  static ULONG WINAPI
>  IRichEditOle_fnAddRef(IRichEditOle *me)
>  {
>      IRichEditOleImpl *This = impl_from_IRichEditOle(me);
> -    return IUnknown_AddRef(This->outer_unk);
> +
> +    ULONG ref = IUnknown_AddRef(&This->IUnknown_inner);
> +    if (This->outer_unk)
> +        IUnknown_AddRef(This->outer_unk);
> +
> +    TRACE ("%p ref=%u\n", This, ref);
> +
> +    return ref;
>  }
>  
>  static ULONG WINAPI
>  IRichEditOle_fnRelease(IRichEditOle *me)
>  {
>      IRichEditOleImpl *This = impl_from_IRichEditOle(me);
> -    return IUnknown_Release(This->outer_unk);
> +
> +    if (This->outer_unk)
> +        IUnknown_Release(This->outer_unk);
> +    ULONG ref = IUnknown_Release(&This->IUnknown_inner);
> +
> +    TRACE ("%p ref=%u\n", This, ref);
> +
> +    return ref;
>  }
>  
>  static HRESULT WINAPI
> @@ -5470,7 +5487,7 @@ LRESULT CreateIRichEditOle(IUnknown *outer_unk, ME_TextEditor *editor, LPVOID *p
>      if (outer_unk)
>          reo->outer_unk = outer_unk;
>      else
> -        reo->outer_unk = &reo->IUnknown_inner;
> +        reo->outer_unk = NULL;
>      *ppvObj = &reo->IRichEditOle_iface;
>  
>      return 1;
> 




More information about the wine-devel mailing list