Module: wine Branch: stable Commit: 1280170c068d8bfae40aee4576bd275f73a32327 URL: http://source.winehq.org/git/wine.git/?a=commit;h=1280170c068d8bfae40aee4576...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Fri Mar 4 11:24:30 2016 +0300
ole32: Don't call spy on IMalloc::Free(NULL).
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com Signed-off-by: Huw Davies huw@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org (cherry picked from commit 110665a3d88d68e0076a435c1e6a1522a964942c) Conflicts: dlls/ole32/tests/compobj.c Signed-off-by: Michael Stefaniuc mstefani@winehq.org
---
dlls/ole32/ifs.c | 3 + dlls/ole32/tests/compobj.c | 135 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 138 insertions(+)
diff --git a/dlls/ole32/ifs.c b/dlls/ole32/ifs.c index 6c7a628..b2c264b 100644 --- a/dlls/ole32/ifs.c +++ b/dlls/ole32/ifs.c @@ -257,6 +257,9 @@ static void WINAPI IMalloc_fnFree(IMalloc *iface, void *pv)
TRACE("(%p)\n",pv);
+ if(!pv) + return; + if(Malloc32.pSpy) { EnterCriticalSection(&IMalloc32_SpyCS); fSpyed = RemoveMemoryLocation(pv); diff --git a/dlls/ole32/tests/compobj.c b/dlls/ole32/tests/compobj.c index 10eb2fa..bddb5b7 100644 --- a/dlls/ole32/tests/compobj.c +++ b/dlls/ole32/tests/compobj.c @@ -2664,6 +2664,140 @@ todo_wine { IMalloc_Release(imalloc); }
+ +static HRESULT WINAPI testspy_QI(IMallocSpy *iface, REFIID riid, void **obj) +{ + if (IsEqualIID(riid, &IID_IMallocSpy) || IsEqualIID(riid, &IID_IUnknown)) + { + *obj = iface; + IMallocSpy_AddRef(iface); + return S_OK; + } + + return E_NOINTERFACE; +} + +static ULONG WINAPI testspy_AddRef(IMallocSpy *iface) +{ + return 2; +} + +static ULONG WINAPI testspy_Release(IMallocSpy *iface) +{ + return 1; +} + +static SIZE_T WINAPI testspy_PreAlloc(IMallocSpy *iface, SIZE_T cb) +{ + ok(0, "unexpected call\n"); + return 0; +} + +static void* WINAPI testspy_PostAlloc(IMallocSpy *iface, void *ptr) +{ + ok(0, "unexpected call\n"); + return NULL; +} + +static void* WINAPI testspy_PreFree(IMallocSpy *iface, void *ptr, BOOL spyed) +{ + ok(0, "unexpected call\n"); + return NULL; +} + +static void WINAPI testspy_PostFree(IMallocSpy *iface, BOOL spyed) +{ + ok(0, "unexpected call\n"); +} + +static SIZE_T WINAPI testspy_PreRealloc(IMallocSpy *iface, void *ptr, SIZE_T cb, void **newptr, BOOL spyed) +{ + ok(0, "unexpected call\n"); + return 0; +} + +static void* WINAPI testspy_PostRealloc(IMallocSpy *iface, void *ptr, BOOL spyed) +{ + ok(0, "unexpected call\n"); + return NULL; +} + +static void* WINAPI testspy_PreGetSize(IMallocSpy *iface, void *ptr, BOOL spyed) +{ + ok(0, "unexpected call\n"); + return NULL; +} + +static SIZE_T WINAPI testspy_PostGetSize(IMallocSpy *iface, SIZE_T actual, BOOL spyed) +{ + ok(0, "unexpected call\n"); + return 0; +} + +static void* WINAPI testspy_PreDidAlloc(IMallocSpy *iface, void *ptr, BOOL spyed) +{ + ok(0, "unexpected call\n"); + return NULL; +} + +static int WINAPI testspy_PostDidAlloc(IMallocSpy *iface, void *ptr, BOOL spyed, int actual) +{ + ok(0, "unexpected call\n"); + return 0; +} + +static void WINAPI testspy_PreHeapMinimize(IMallocSpy *iface) +{ + ok(0, "unexpected call\n"); +} + +static void WINAPI testspy_PostHeapMinimize(IMallocSpy *iface) +{ + ok(0, "unexpected call\n"); +} + +static const IMallocSpyVtbl testspyvtbl = +{ + testspy_QI, + testspy_AddRef, + testspy_Release, + testspy_PreAlloc, + testspy_PostAlloc, + testspy_PreFree, + testspy_PostFree, + testspy_PreRealloc, + testspy_PostRealloc, + testspy_PreGetSize, + testspy_PostGetSize, + testspy_PreDidAlloc, + testspy_PostDidAlloc, + testspy_PreHeapMinimize, + testspy_PostHeapMinimize +}; + +static IMallocSpy testspy = { &testspyvtbl }; + +static void test_IMallocSpy(void) +{ + IMalloc *imalloc; + HRESULT hr; + + hr = CoRegisterMallocSpy(&testspy); + ok(hr == S_OK, "got 0x%08x\n", hr); + + imalloc = NULL; + hr = CoGetMalloc(MEMCTX_TASK, &imalloc); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(imalloc != NULL, "got %p\n", imalloc); + + IMalloc_Free(imalloc, NULL); + + IMalloc_Release(imalloc); + + hr = CoRevokeMallocSpy(); + ok(hr == S_OK, "got 0x%08x\n", hr); +} + static void init_funcs(void) { HMODULE hOle32 = GetModuleHandleA("ole32"); @@ -2727,4 +2861,5 @@ START_TEST(compobj) test_CoCreateGuid(); test_CoWaitForMultipleHandles(); test_CoGetMalloc(); + test_IMallocSpy(); }