* 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:
parent
8e65adb67d
commit
ee673194b4
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue