ole32: Fix IMalloc::DidAlloc() return value to reflect block validity.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Nikolay Sivov 2020-04-16 22:01:48 +03:00 committed by Alexandre Julliard
parent c56e5695a7
commit 08f4b6ee0a
2 changed files with 58 additions and 22 deletions

View File

@ -114,6 +114,20 @@ static BOOL AddMemoryLocation(LPVOID * pMem)
return TRUE; return TRUE;
} }
static void** mallocspy_is_allocation_spyed(const void *mem)
{
void **current = Malloc32.SpyedBlocks;
while (*current != mem)
{
current++;
if (current >= Malloc32.SpyedBlocks + Malloc32.SpyedBlockTableLength)
return NULL;
}
return current;
}
static BOOL RemoveMemoryLocation(LPCVOID pMem) static BOOL RemoveMemoryLocation(LPCVOID pMem)
{ {
LPVOID * Current; LPVOID * Current;
@ -122,14 +136,8 @@ static BOOL RemoveMemoryLocation(LPCVOID pMem)
if (!Malloc32.SpyedBlockTableLength && !SetSpyedBlockTableLength(0x1000)) if (!Malloc32.SpyedBlockTableLength && !SetSpyedBlockTableLength(0x1000))
return FALSE; return FALSE;
Current = Malloc32.SpyedBlocks; if (!(Current = mallocspy_is_allocation_spyed(pMem)))
return FALSE;
/* find the location */
while (*Current != pMem) {
Current++;
if (Current >= Malloc32.SpyedBlocks + Malloc32.SpyedBlockTableLength)
return FALSE; /* not found */
}
/* location found */ /* location found */
Malloc32.SpyedAllocationsLeft--; Malloc32.SpyedAllocationsLeft--;
@ -313,25 +321,32 @@ static SIZE_T WINAPI IMalloc_fnGetSize(IMalloc *iface, void *pv)
/****************************************************************************** /******************************************************************************
* IMalloc32_DidAlloc [VTABLE] * IMalloc32_DidAlloc [VTABLE]
*/ */
static INT WINAPI IMalloc_fnDidAlloc(IMalloc *iface, void *pv) static INT WINAPI IMalloc_fnDidAlloc(IMalloc *iface, void *mem)
{ {
BOOL fSpyed = FALSE; BOOL spyed_block = FALSE;
int didAlloc; int did_alloc;
TRACE("(%p)\n",pv); TRACE("(%p)\n", mem);
if(Malloc32.pSpy) { if (!mem)
return -1;
if (Malloc32.pSpy)
{
EnterCriticalSection(&IMalloc32_SpyCS); EnterCriticalSection(&IMalloc32_SpyCS);
pv = IMallocSpy_PreDidAlloc(Malloc32.pSpy, pv, fSpyed); spyed_block = !!mallocspy_is_allocation_spyed(mem);
mem = IMallocSpy_PreDidAlloc(Malloc32.pSpy, mem, spyed_block);
} }
didAlloc = -1; did_alloc = HeapValidate(GetProcessHeap(), 0, mem);
if(Malloc32.pSpy) { if (Malloc32.pSpy)
didAlloc = IMallocSpy_PostDidAlloc(Malloc32.pSpy, pv, fSpyed, didAlloc); {
did_alloc = IMallocSpy_PostDidAlloc(Malloc32.pSpy, mem, spyed_block, did_alloc);
LeaveCriticalSection(&IMalloc32_SpyCS); LeaveCriticalSection(&IMalloc32_SpyCS);
} }
return didAlloc;
return did_alloc;
} }
/****************************************************************************** /******************************************************************************

View File

@ -3069,6 +3069,8 @@ static void test_CoGetMalloc(void)
{ {
IMalloc *imalloc; IMalloc *imalloc;
HRESULT hr; HRESULT hr;
char *ptr;
int ret;
if (0) /* crashes on native */ if (0) /* crashes on native */
hr = CoGetMalloc(0, NULL); hr = CoGetMalloc(0, NULL);
@ -3102,6 +3104,25 @@ static void test_CoGetMalloc(void)
hr = CoGetMalloc(MEMCTX_TASK, &imalloc); hr = CoGetMalloc(MEMCTX_TASK, &imalloc);
ok(hr == S_OK, "got 0x%08x\n", hr); ok(hr == S_OK, "got 0x%08x\n", hr);
ok(imalloc != NULL, "got %p\n", imalloc); ok(imalloc != NULL, "got %p\n", imalloc);
/* DidAlloc() */
ptr = IMalloc_Alloc(imalloc, 16);
ok(!!ptr, "Failed to allocate block.\n");
ret = IMalloc_DidAlloc(imalloc, ptr);
ok(ret == 1, "Unexpected return value %d.\n", ret);
ret = IMalloc_DidAlloc(imalloc, NULL);
ok(ret == -1, "Unexpected return value %d.\n", ret);
ret = IMalloc_DidAlloc(imalloc, (void *)0x1);
ok(ret == 0, "Unexpected return value %d.\n", ret);
ret = IMalloc_DidAlloc(imalloc, ptr + 4);
ok(ret == 0, "Unexpected return value %d.\n", ret);
IMalloc_Free(imalloc, ptr);
IMalloc_Release(imalloc); IMalloc_Release(imalloc);
} }