Blob Blame History Raw
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