Zebediah Figura : compobj: Reference the IMalloc pointer in CoInitialize().

Alexandre Julliard julliard at winehq.org
Wed Jan 22 14:52:58 CST 2020


Module: wine
Branch: master
Commit: 588af8ca85a4f79b301c4a323a18d60b8b5d4e02
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=588af8ca85a4f79b301c4a323a18d60b8b5d4e02

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Wed Jan 15 00:24:31 2020 -0600

compobj: Reference the IMalloc pointer in CoInitialize().

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=42554
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/compobj.dll16/compobj.c | 34 ++++++++++++++++++++++++++++++----
 1 file changed, 30 insertions(+), 4 deletions(-)

diff --git a/dlls/compobj.dll16/compobj.c b/dlls/compobj.dll16/compobj.c
index 44a7091ef1..52e5d72688 100644
--- a/dlls/compobj.dll16/compobj.c
+++ b/dlls/compobj.dll16/compobj.c
@@ -67,6 +67,28 @@ typedef struct
     SEGPTR lpVtbl;
 } IMalloc16;
 
+static ULONG call_IMalloc_AddRef(SEGPTR iface)
+{
+    IMalloc16 *malloc = MapSL(iface);
+    IMalloc16Vtbl *vtbl = MapSL(malloc->lpVtbl);
+    DWORD args[1], ret;
+
+    args[0] = iface;
+    WOWCallback16Ex(vtbl->AddRef, WCB16_CDECL, sizeof(args), args, &ret);
+    return ret;
+}
+
+static ULONG call_IMalloc_Release(SEGPTR iface)
+{
+    IMalloc16 *malloc = MapSL(iface);
+    IMalloc16Vtbl *vtbl = MapSL(malloc->lpVtbl);
+    DWORD args[1], ret;
+
+    args[0] = iface;
+    WOWCallback16Ex(vtbl->Release, WCB16_CDECL, sizeof(args), args, &ret);
+    return ret;
+}
+
 static SEGPTR call_IMalloc_Alloc(SEGPTR iface, DWORD size)
 {
     IMalloc16 *malloc = MapSL(iface);
@@ -288,8 +310,9 @@ SEGPTR WINAPI CoMemAlloc(DWORD size, MEMCTX context, DWORD unknown)
 HRESULT WINAPI CoInitialize16(SEGPTR malloc)
 {
     if (!malloc)
-        CoCreateStandardMalloc16(MEMCTX_TASK, &malloc);
-    compobj_malloc = malloc;
+        CoCreateStandardMalloc16(MEMCTX_TASK, &compobj_malloc);
+    else
+        call_IMalloc_AddRef(compobj_malloc = malloc);
     return S_OK;
 }
 
@@ -301,8 +324,11 @@ HRESULT WINAPI CoInitialize16(SEGPTR malloc)
  */
 void WINAPI CoUninitialize16(void)
 {
-  TRACE("()\n");
-  CoFreeAllLibraries();
+    TRACE("\n");
+
+    CoFreeAllLibraries();
+    call_IMalloc_Release(compobj_malloc);
+    compobj_malloc = 0;
 }
 
 /***********************************************************************




More information about the wine-cvs mailing list