From 06d36b1adf1ae7b73a200d6a35a143f6b3fd91c9 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Thu, 16 Apr 2020 22:01:50 +0300 Subject: [PATCH] ole32: Fix spy callback arguments for IMalloc::GetSize(). Signed-off-by: Nikolay Sivov Signed-off-by: Alexandre Julliard --- dlls/ole32/ifs.c | 35 +++++++++++++++++++++-------------- dlls/ole32/tests/compobj.c | 8 ++++++++ 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/dlls/ole32/ifs.c b/dlls/ole32/ifs.c index 410691b2a8b..1b19be424cf 100644 --- a/dlls/ole32/ifs.c +++ b/dlls/ole32/ifs.c @@ -296,26 +296,33 @@ static void WINAPI IMalloc_fnFree(IMalloc *iface, void *pv) * win95: size allocated (4 byte boundaries) * win2k: size originally requested !!! (allocated on 8 byte boundaries) */ -static SIZE_T WINAPI IMalloc_fnGetSize(IMalloc *iface, void *pv) +static SIZE_T WINAPI IMalloc_fnGetSize(IMalloc *iface, void *mem) { - SIZE_T cb; - BOOL fSpyed = FALSE; + BOOL spyed_block = FALSE, spy_active = FALSE; + SIZE_T size; - TRACE("(%p)\n",pv); + TRACE("(%p)\n", mem); - if(Malloc32.pSpy) { - EnterCriticalSection(&IMalloc32_SpyCS); - pv = IMallocSpy_PreGetSize(Malloc32.pSpy, pv, fSpyed); - } + if (!mem) + return (SIZE_T)-1; - cb = HeapSize(GetProcessHeap(),0,pv); + if (Malloc32.pSpy) + { + EnterCriticalSection(&IMalloc32_SpyCS); + spyed_block = !!mallocspy_is_allocation_spyed(mem); + spy_active = TRUE; + mem = IMallocSpy_PreGetSize(Malloc32.pSpy, mem, spyed_block); + } - if(Malloc32.pSpy) { - cb = IMallocSpy_PostGetSize(Malloc32.pSpy, cb, fSpyed); - LeaveCriticalSection(&IMalloc32_SpyCS); - } + size = HeapSize(GetProcessHeap(), 0, mem); - return cb; + if (spy_active) + { + size = IMallocSpy_PostGetSize(Malloc32.pSpy, size, spyed_block); + LeaveCriticalSection(&IMalloc32_SpyCS); + } + + return size; } /****************************************************************************** diff --git a/dlls/ole32/tests/compobj.c b/dlls/ole32/tests/compobj.c index b0a6ba1ea7f..d6ccbc58823 100644 --- a/dlls/ole32/tests/compobj.c +++ b/dlls/ole32/tests/compobj.c @@ -3068,6 +3068,7 @@ static void test_CoWaitForMultipleHandles(void) static void test_CoGetMalloc(void) { IMalloc *imalloc; + SIZE_T size; HRESULT hr; char *ptr; int ret; @@ -3121,6 +3122,13 @@ static void test_CoGetMalloc(void) ret = IMalloc_DidAlloc(imalloc, ptr + 4); ok(ret == 0, "Unexpected return value %d.\n", ret); + /* GetSize() */ + size = IMalloc_GetSize(imalloc, NULL); + ok(size == (SIZE_T)-1, "Unexpected return value.\n"); + + size = IMalloc_GetSize(imalloc, ptr); + ok(size == 16, "Unexpected return value.\n"); + IMalloc_Free(imalloc, ptr); IMalloc_Release(imalloc);