* fix memory allocator bug that lead to freelist corruption on the first malloc

(and spent 8 bytes too much per malloc)
* if the memory allocator detects freelist corruption, print a message
  instead of silently dying.

Signed-off-by: Stefan Reinauer <stepan@coresystems.de>
Acked-by: Jordan Crouse <jordan.crouse@amd.com>



git-svn-id: svn://svn.coreboot.org/coreboot/trunk@3510 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
This commit is contained in:
Stefan Reinauer 2008-08-14 14:40:10 +00:00 committed by Stefan Reinauer
parent 8e65adb67d
commit ee673194b4
1 changed files with 5 additions and 3 deletions

View File

@ -92,13 +92,15 @@ static void *alloc(int len)
header = *((hdrtype_t *) ptr); header = *((hdrtype_t *) ptr);
int size = SIZE(header); int size = SIZE(header);
if (!HAS_MAGIC(header) || size == 0) if (!HAS_MAGIC(header) || size == 0) {
printf("memory allocator panic.\n");
halt(); halt();
}
if (header & FLAG_FREE) { if (header & FLAG_FREE) {
if (len <= size) { if (len <= size) {
void *nptr = ptr + (HDRSIZE + len); void *nptr = ptr + (HDRSIZE + len);
int nsize = size - (len + 8); int nsize = size - (HDRSIZE + len);
/* Mark the block as used. */ /* Mark the block as used. */
*((hdrtype_t *) ptr) = USED_BLOCK(len); *((hdrtype_t *) ptr) = USED_BLOCK(len);
@ -109,7 +111,7 @@ static void *alloc(int len)
if (nsize > 0) if (nsize > 0)
*((hdrtype_t *) nptr) = *((hdrtype_t *) nptr) =
FREE_BLOCK(nsize - 4); FREE_BLOCK(nsize);
return (void *)(ptr + HDRSIZE); return (void *)(ptr + HDRSIZE);
} }