summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
960a090)
- 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)
static void * _mycalloc(int n, unsigned int size)
{
static void * _mycalloc(int n, unsigned int size)
{
- void * pointer = _mymalloc(size);
+ void * pointer = _mymalloc(n*size);
- memset(pointer, 0, size);
+ memset(pointer, 0, n*size);
- pointer = malloc(size + 2 * REDZONE);
+ pointer = size ? malloc(size + 2 * REDZONE) : null;
{
MemInfo block;
MemStack stack = (MemStack)memStacks.Find(GetCurrentThreadID());
{
MemInfo block;
MemStack stack = (MemStack)memStacks.Find(GetCurrentThreadID());
- 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;
+ }
- return (byte*)pointer + REDZONE;
+ return pointer ? ((byte*)pointer + REDZONE) : null;
}
static void * _calloc(int n, unsigned int size)
}
static void * _calloc(int n, unsigned int size)
- pointer = calloc(n, size + 2 * REDZONE);
+ pointer = (n*size) ? calloc(1, n*size + 2 * REDZONE) : null;
-{
- MemStack stack;
- stack = (MemStack)memStacks.Find(GetCurrentThreadID());
- if(!stack)
- {
- stack = (MemStack)calloc(1, sizeof(class MemStack));
- stack.key = GetCurrentThreadID();
- memStacks.Add(stack);
- }
- if(!pointer)
- int c;
- printf("Memory allocation of %d bytes failed\n", size);
- printf("Current Stack:\n");
- for(c = 0; c<stack.pos; c++)
- if(stack.frames[c])
- printf(" %s\n", stack.frames[c]);
- memoryErrorsCount++;
- memMutex.Release();
- return null;
- }
+ MemStack stack;
+ stack = (MemStack)memStacks.Find(GetCurrentThreadID());
+ if(!stack)
+ {
+ stack = (MemStack)calloc(1, sizeof(class MemStack));
+ stack.key = GetCurrentThreadID();
+ memStacks.Add(stack);
+ }
+ if(!pointer)
+ {
+ int c;
+ printf("Memory allocation of %d bytes failed\n", size);
+ printf("Current Stack:\n");
+ for(c = 0; c<stack.pos; c++)
+ if(stack.frames[c])
+ printf(" %s\n", stack.frames[c]);
+ memoryErrorsCount++;
+ memMutex.Release();
+ return null;
+ }
- if(!recurse && !stack.recurse)
- {
- MemInfo block;
-
- stack.recurse = true;
- block = MemInfo { size = size, key = (uintptr)((byte *)pointer + REDZONE), _class = allocateClass, internal = allocateInternal, id = blockID++ };
- memcpy(block.allocLoc, stack.frames + stack.pos - Min(stack.pos, MAX_MEMORY_LOC), Min(stack.pos, MAX_MEMORY_LOC) * sizeof(char *));
- memBlocks.Add(block);
- stack.recurse = false;
+ if(!recurse && !stack.recurse)
+ {
+ MemInfo block;
+
+ stack.recurse = true;
+ block = MemInfo { (unsigned int)n*size = size, key = (uintptr)((byte *)pointer + REDZONE), _class = allocateClass, internal = allocateInternal, id = blockID++ };
+ memcpy(block.allocLoc, stack.frames + stack.pos - Min(stack.pos, MAX_MEMORY_LOC), Min(stack.pos, MAX_MEMORY_LOC) * sizeof(char *));
+ memBlocks.Add(block);
+ stack.recurse = false;
+ }
- memset(pointer, 0xEC, REDZONE);
- memset((byte *)pointer + REDZONE + size, 0xEC, REDZONE);
+ if(pointer)
+ {
+ memset(pointer, 0xAB, REDZONE);
+ memset((byte *)pointer + REDZONE + (unsigned int)n*size, 0xAB, REDZONE);
+ }
- return (byte*)pointer + REDZONE;
+ return pointer ? ((byte*)pointer + REDZONE) : null;
}
static void * _realloc(void * pointer, unsigned int size)
}
static void * _realloc(void * pointer, unsigned int size)
memMutex.Release();
return null;
}
memMutex.Release();
return null;
}
- memset(pointer, 0xEC, REDZONE);
- memset((byte *)pointer + REDZONE + size, 0xEC, REDZONE);
+ memset(pointer, 0xAB, REDZONE);
+ memset((byte *)pointer + REDZONE + size, 0xAB, REDZONE);
{
memcpy(block.freeLoc, stack.frames + stack.pos - Min(stack.pos, MAX_MEMORY_LOC), Min(stack.pos, MAX_MEMORY_LOC) * sizeof(char *));
memcpy((byte *)pointer + REDZONE, (byte *)block.key, Min(block.size, size));
{
memcpy(block.freeLoc, stack.frames + stack.pos - Min(stack.pos, MAX_MEMORY_LOC), Min(stack.pos, MAX_MEMORY_LOC) * sizeof(char *));
memcpy((byte *)pointer + REDZONE, (byte *)block.key, Min(block.size, size));
- block.oldmem = (byte *)malloc(block.size + REDZONE * 2) + REDZONE;
- memcpy(block.oldmem - REDZONE, (byte *)block.key - REDZONE, block.size + 2 * REDZONE);
+ block.oldmem = (byte *)malloc(block.size + REDZONE * 2);
+ if(block.oldmem)
+ {
+ block.oldmem += REDZONE;
+ memcpy(block.oldmem - REDZONE, (byte *)block.key - REDZONE, block.size + 2 * REDZONE);
+ }
memset((byte *)block.key - REDZONE, 0xEC, block.size + REDZONE * 2);
block.freed = true;
}
memset((byte *)block.key - REDZONE, 0xEC, block.size + REDZONE * 2);
block.freed = true;
}
#if !defined(ECERE_BOOTSTRAP)
memMutex.Release();
#endif
#if !defined(ECERE_BOOTSTRAP)
memMutex.Release();
#endif
- return (byte *)pointer + REDZONE;
+ return pointer ? ((byte *)pointer + REDZONE) : null;
}
static void * _crealloc(void * pointer, unsigned int size)
}
static void * _crealloc(void * pointer, unsigned int size)
memMutex.Release();
return null;
}
memMutex.Release();
return null;
}
- memset(pointer, 0xEC, REDZONE);
- memset((byte *)pointer + REDZONE + size, 0xEC, REDZONE);
+ memset(pointer, 0xAB, REDZONE);
+ memset((byte *)pointer + REDZONE + size, 0xAB, REDZONE);
{
memcpy(block.freeLoc, stack.frames + stack.pos - Min(stack.pos, MAX_MEMORY_LOC), Min(stack.pos, MAX_MEMORY_LOC) * sizeof(char *));
memcpy((byte *)pointer + REDZONE, (byte *)block.key, Min(block.size, size));
{
memcpy(block.freeLoc, stack.frames + stack.pos - Min(stack.pos, MAX_MEMORY_LOC), Min(stack.pos, MAX_MEMORY_LOC) * sizeof(char *));
memcpy((byte *)pointer + REDZONE, (byte *)block.key, Min(block.size, size));
- block.oldmem = (byte *)malloc(block.size + REDZONE * 2) + REDZONE;
- memcpy(block.oldmem - REDZONE, (byte *)block.key - REDZONE, block.size + 2 * REDZONE);
+ block.oldmem = (byte *)malloc(block.size + REDZONE * 2);
+ if(block.oldmem)
+ {
+ block.oldmem += REDZONE;
+ memcpy(block.oldmem - REDZONE, (byte *)block.key - REDZONE, block.size + 2 * REDZONE);
+ }
memset((byte *)block.key - REDZONE, 0xEC, block.size + REDZONE * 2);
block.freed = true;
}
memset((byte *)block.key - REDZONE, 0xEC, block.size + REDZONE * 2);
block.freed = true;
}
#if !defined(ECERE_BOOTSTRAP)
memMutex.Release();
#endif
#if !defined(ECERE_BOOTSTRAP)
memMutex.Release();
#endif
- return (byte *)pointer + REDZONE;
+ return pointer ? ((byte *)pointer + REDZONE) : null;
}
static void _free(void * pointer)
}
static void _free(void * pointer)
address = (byte *)block.key;
for(c = 0; c<REDZONE; c++)
{
address = (byte *)block.key;
for(c = 0; c<REDZONE; c++)
{
- if(address[-c-1] != 0xEC)
+ if(address[-c-1] != 0xAB)
{
printf("Buffer Underrun\n");
memoryErrorsCount++;
block.OutputStacks(block.freed);
}
{
printf("Buffer Underrun\n");
memoryErrorsCount++;
block.OutputStacks(block.freed);
}
- if(address[c + size] != 0xEC)
+ if(address[c + size] != 0xAB)
{
printf("Buffer Overrun\n");
memoryErrorsCount++;
{
printf("Buffer Overrun\n");
memoryErrorsCount++;
- block.oldmem = (byte *)malloc(block.size + REDZONE * 2) + REDZONE;
- memcpy(block.oldmem - REDZONE, (byte *)block.key - REDZONE, block.size + REDZONE * 2);
+ block.oldmem = (byte *)malloc(block.size + REDZONE * 2);
+ if(block.oldmem)
+ {
+ block.oldmem += REDZONE;
+ memcpy(block.oldmem - REDZONE, (byte *)block.key - REDZONE, block.size + REDZONE * 2);
+ }
memset((byte *)block.key - REDZONE, 0xEC, block.size + REDZONE * 2);
memcpy(block.freeLoc, stack.frames + stack.pos - Min(stack.pos, MAX_MEMORY_LOC), Min(stack.pos, MAX_MEMORY_LOC) * sizeof(char *));
memset((byte *)block.key - REDZONE, 0xEC, block.size + REDZONE * 2);
memcpy(block.freeLoc, stack.frames + stack.pos - Min(stack.pos, MAX_MEMORY_LOC), Min(stack.pos, MAX_MEMORY_LOC) * sizeof(char *));
address = (byte *)block.key;
for(c = 0; c<REDZONE; c++)
{
address = (byte *)block.key;
for(c = 0; c<REDZONE; c++)
{
- if(address[-c-1] != 0xEC)
+ if(address[-c-1] != 0xAB)
{
printf("Buffer Underrun\n");
memoryErrorsCount++;
block.OutputStacks(block.freed);
}
{
printf("Buffer Underrun\n");
memoryErrorsCount++;
block.OutputStacks(block.freed);
}
- if(address[c + size] != 0xEC)
+ if(address[c + size] != 0xAB)
{
printf("Buffer Overrun\n");
memoryErrorsCount++;
{
printf("Buffer Overrun\n");
memoryErrorsCount++;