From 9e3d9b981ca9a9799bcb172038c905c4b55c580d Mon Sep 17 00:00:00 2001 From: Jerome St-Louis Date: Sat, 16 Mar 2013 16:50:53 -0400 Subject: [PATCH] ecere/com/memory manager: MemoryGuard fixes - Handle n*size for calloc (even though it is unused) - Using 0xAB instead of 0xEC for overruns/underruns to distinguish from freed memory - Prevent failed allocation to be offset by REDZONE (return null properly) --- ecere/src/com/instance.ec | 133 +++++++++++++++++++++++++++------------------- 1 file changed, 77 insertions(+), 56 deletions(-) diff --git a/ecere/src/com/instance.ec b/ecere/src/com/instance.ec index 13d6847..99cf19e 100644 --- a/ecere/src/com/instance.ec +++ b/ecere/src/com/instance.ec @@ -1205,9 +1205,9 @@ static void * _mymalloc(unsigned int size) static void * _mycalloc(int n, unsigned int size) { - void * pointer = _mymalloc(size); + void * pointer = _mymalloc(n*size); if(pointer) - memset(pointer, 0, size); + memset(pointer, 0, n*size); return pointer; } @@ -1363,8 +1363,9 @@ static void * _malloc(unsigned int size) memMutex.Wait(); #endif - pointer = malloc(size + 2 * REDZONE); + pointer = size ? malloc(size + 2 * REDZONE) : null; #ifdef MEMINFO + if(pointer) { MemInfo block; MemStack stack = (MemStack)memStacks.Find(GetCurrentThreadID()); @@ -1405,11 +1406,14 @@ static void * _malloc(unsigned int size) #endif #if REDZONE - memset(pointer, 0xEC, REDZONE); - memset((byte *)pointer + REDZONE + size, 0xEC, REDZONE); - // ((byte *)pointer)[0] = 0x00; + if(pointer) + { + memset(pointer, 0xAB, REDZONE); + memset((byte *)pointer + REDZONE + size, 0xAB, REDZONE); + // ((byte *)pointer)[0] = 0x00; + } #endif - return (byte*)pointer + REDZONE; + return pointer ? ((byte*)pointer + REDZONE) : null; } static void * _calloc(int n, unsigned int size) @@ -1419,39 +1423,41 @@ static void * _calloc(int n, unsigned int size) memMutex.Wait(); #endif - pointer = calloc(n, size + 2 * REDZONE); + pointer = (n*size) ? calloc(1, n*size + 2 * REDZONE) : null; #ifdef MEMINFO -{ - MemStack stack; - stack = (MemStack)memStacks.Find(GetCurrentThreadID()); - if(!stack) - { - stack = (MemStack)calloc(1, sizeof(class MemStack)); - stack.key = GetCurrentThreadID(); - memStacks.Add(stack); - } - if(!pointer) + if(pointer) { - int c; - printf("Memory allocation of %d bytes failed\n", size); - printf("Current Stack:\n"); - for(c = 0; c