Fix overflow caltions bugs in varus memmory functions, Thanks irc : Elrond (from TNG) for fixing calloc overflow bug.

svn path=/trunk/; revision=22196
This commit is contained in:
Magnus Olsen 2006-06-03 17:18:09 +00:00
parent 3b3b7ad5fd
commit f895d5ab82

View file

@ -36,10 +36,17 @@ extern HANDLE hHeap;
*/ */
void* malloc(size_t _size) void* malloc(size_t _size)
{ {
size_t nSize;
if ( _size == 0) if ( _size == 0)
return NULL; return NULL;
return HeapAlloc(hHeap, 0, ROUND_SIZE(_size)); nSize = ROUND_SIZE(_size);
if (nSize<_size)
return NULL;
return HeapAlloc(hHeap, 0, nSize);
} }
/* /*
@ -54,11 +61,14 @@ void free(void* _ptr)
* @implemented * @implemented
*/ */
void* calloc(size_t _nmemb, size_t _size) void* calloc(size_t _nmemb, size_t _size)
{ {
if ( _size == 0) size_t nSize = _nmemb * _size;
return NULL; size_t cSize = ROUND_SIZE(nSize);
return HeapAlloc(hHeap, HEAP_ZERO_MEMORY, ROUND_SIZE(_nmemb*_size) ); if ((_nmemb > ((size_t)-1 / _size) || (nSize == 0) || (cSize<nSize))
return NULL;
return HeapAlloc(hHeap, HEAP_ZERO_MEMORY, cSize );
} }
/* /*
@ -66,11 +76,18 @@ void* calloc(size_t _nmemb, size_t _size)
*/ */
void* realloc(void* _ptr, size_t _size) void* realloc(void* _ptr, size_t _size)
{ {
size_t nSize;
if ( _size == 0) if ( _size == 0)
return NULL; return NULL;
nSize = ROUND_SIZE(_size);
if (nSize<_size)
return NULL;
if (!_ptr) return malloc(_size); if (!_ptr) return malloc(_size);
if (_size) return HeapReAlloc(hHeap, 0, _ptr, ROUND_SIZE(_size)); if (_size) return HeapReAlloc(hHeap, 0, _ptr, nSize);
free(_ptr); free(_ptr);
return NULL; return NULL;
} }
@ -80,10 +97,17 @@ void* realloc(void* _ptr, size_t _size)
*/ */
void* _expand(void* _ptr, size_t _size) void* _expand(void* _ptr, size_t _size)
{ {
size_t nSize;
if ( _size == 0) if ( _size == 0)
return NULL; return NULL;
nSize = ROUND_SIZE(_size);
if (nSize<_size)
return NULL;
return HeapReAlloc(hHeap, HEAP_REALLOC_IN_PLACE_ONLY, _ptr, ROUND_SIZE(_size)); return HeapReAlloc(hHeap, HEAP_REALLOC_IN_PLACE_ONLY, _ptr, nSize);
} }
/* /*