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

Sven Baars sven.wine at gmail.com
Wed Jan 30 04:35:22 CST 2019


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;
-- 
2.17.1




More information about the wine-devel mailing list