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