diff -up Singular-3-1-5/factory/memutil.c.orig Singular-3-1-5/factory/memutil.c --- Singular-3-1-5/factory/memutil.c.orig 2012-08-04 19:27:46.730415777 -0400 +++ Singular-3-1-5/factory/memutil.c 2012-08-04 19:27:49.200415874 -0400 @@ -19,6 +19,10 @@ typedef struct dummy_le { static listentry * blocklist[7] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL }; +#define EXTRA 4 +#define MAGIC 0xbeefbeef +#define DEAD 0xdeaddead + #define GETBLOCK( list, size ) { \ if ( blocklist[list] ) { \ listentry* retval = blocklist[list]; \ @@ -27,32 +31,34 @@ static listentry * blocklist[7] = { NULL } \ else { \ char* retval = (char*)malloc( size ); \ - *((int*)retval) = size-4; \ - retval += 4; \ + *((int*)retval) = size-4-EXTRA; \ + *((int*)retval+1) = MAGIC; \ + retval += 4+EXTRA; \ return (void*)retval; \ } \ } void* getBlock ( size_t size ) { - if ( size <= 4 ) + if ( size <= 4 - EXTRA ) GETBLOCK( 0, 8 ) - else if ( size <= 12 ) + else if ( size <= 12 - EXTRA ) GETBLOCK( 1, 16 ) - else if ( size <= 28 ) + else if ( size <= 28 - EXTRA ) GETBLOCK( 2, 32 ) - else if ( size <= 60 ) + else if ( size <= 60 - EXTRA ) GETBLOCK( 3, 64 ) - else if ( size <= 124 ) + else if ( size <= 124 - EXTRA ) GETBLOCK( 4, 128 ) - else if ( size <= 252 ) + else if ( size <= 252 - EXTRA ) GETBLOCK( 5, 256 ) - else if ( size <= 508 ) + else if ( size <= 508 - EXTRA ) GETBLOCK( 6, 512 ) else { - char* retval = (char*)malloc( size+4 ); + char* retval = (char*)malloc( size+4+EXTRA ); *((int*)retval) = size; - retval += 4; + *((int*)retval+1) = MAGIC; + retval += 4+EXTRA; return retval; } } @@ -63,12 +69,14 @@ void* getBlock ( size_t size ) blocklist[list] = dummy; \ } -void freeBlock ( void* block, size_t size ) +void freeBlock ( void* block, size_t size0 ) { char* dummy = (char*)block; if ( block == NULL ) return; - dummy -= 4; - size = *((int*)dummy); + dummy -= 4+EXTRA; + int magic = *((int*)dummy+1); + ASSERT( magic == MAGIC , "freeBlock: wrong magic number" ); + int size = *((int*)dummy); if ( size == 4 ) FREEBLOCK( 0, block ) else if ( size == 12 ) @@ -91,7 +99,9 @@ void* reallocBlock ( void* block, size_t { void * dummy; #if 1 - char* dum = (char*)block - 4; + char* dum = (char*)block - 4 - EXTRA; + int magic = *((int*)dum+1); + ASSERT( magic == MAGIC , "reallocBlock: wrong magic number" ); int size = *((int*)dum); if (newsize <= size) return block; #endif