View Issue Details

IDProjectCategoryView StatusLast Update
0000368LDMud 3.3Runtimepublic2005-05-15 13:02
ReporterGnomi Assigned Tolars 
PrioritynormalSeveritycrashReproducibilityalways
Status closedResolutionfixed 
Platformi686OSDebian GNU/LinuxOS Version3.0
Product Version3.3 
Fixed in Version3.3 
Summary0000368: large_malloc crashes when coalescing free blocks
DescriptionHi,

the driver crashed with the message "remove_from_free_list: block 0x8276004, magic match failed: expected dfaff2ee, found 0" and the following backtrace:

#0 0x080a5606 in collect_trace (sbuf=0xbfffe690, rvec=0x0) at interpret.c:18386
0000001 0x080a69d6 in dump_trace (how=1, rvec=0x0) at interpret.c:18679
0000002 0x080fe0be in fatal (fmt=0x8146040 "remove_from_free_list: block %p, magic m
atch failed: expected %lx, found %lx\n") at simulate.c:625
0000003 0x081186b5 in remove_from_free_list (ptr=0x8276004) at slaballoc.c:2116
0000004 0x0811976f in large_malloc (size=33554440, force_more=0) at slaballoc.c:3109
0000005 0x081178b5 in mem_alloc (size=134217748) at slaballoc.c:1366
0000006 0x0811a948 in xalloc_traced (size=134217748, malloc_trace_file=0x8146418 "xa
lloc.c", malloc_trace_line=1500) at xalloc.c:518
0000007 0x0811b937 in reserve_memory () at xalloc.c:1500
0000008 0x080b834d in main (argc=6, argv=0xbffffa14) at main.c:395

The immediate reason for the segfault is that the standard strings weren't initialized yet. But the fatal driver error occurs, because in large_malloc the call to add_large_free coalesced the block from esbrk with a previous block, but large_malloc didn't update its pointer. So large_malloc continues to work with the pointer from esbrk, but the management information including the magic word is at the beginning of the previous block. And thus remove_from_free_list rightfully complains about the missing magic word.

Greetings,
Gnomi.
TagsNo tags attached.
Attached Files
slaballoc.diff (1,029 bytes)   
diff -aur 3-3.old/src/slaballoc.c 3-3/src/slaballoc.c
--- 3-3.old/src/slaballoc.c	2005-02-21 10:16:34.000000000 +0100
+++ 3-3/src/slaballoc.c	2005-02-21 10:17:45.000000000 +0100
@@ -2823,7 +2823,7 @@
 } /* mark_block() */
 
 /*-------------------------------------------------------------------------*/
-static void
+static word_t *
 add_large_free (word_t *ptr, word_t block_size)
 
 /* The large memory block <ptr> with size <block_size> is free:
@@ -2850,6 +2850,8 @@
     /* Mark the block as free and add it to the freelist */
     build_block(ptr, block_size);
     add_to_free_list(ptr);
+    
+    return ptr;
 } /* add_large_free() */
 
 /*-------------------------------------------------------------------------*/
@@ -3089,7 +3091,7 @@
         block_size = chunk_size / SINT;
 
         /* Add block to free memory. */
-        add_large_free(ptr, block_size);
+        ptr = add_large_free(ptr, block_size);
     } /* end of creating a new chunk */
 
     /* ptr is now a pointer to a free block in the free list */
slaballoc.diff (1,029 bytes)   

Activities

Gnomi

2005-02-21 03:22

manager   ~0000345

I have attached a simple diff for slaballoc which works for me.
(Should be the same for smalloc, but I haven't tested.)

lars

2005-02-21 03:32

reporter   ~0000346

Yep - once you know the error is there, it's kind of blindingly obvious. I didn't catch it before because on my machine this situation just didn't happen. It's now fixed in 3.3.678.

Thanks!

Issue History

Date Modified Username Field Change
2005-02-21 03:09 Gnomi New Issue
2005-02-21 03:20 Gnomi File Added: slaballoc.diff
2005-02-21 03:22 Gnomi Note Added: 0000345
2005-02-21 03:32 lars Status new => resolved
2005-02-21 03:32 lars Fixed in Version => 3.3
2005-02-21 03:32 lars Resolution open => fixed
2005-02-21 03:32 lars Assigned To => lars
2005-02-21 03:32 lars Note Added: 0000346
2005-05-15 13:02 lars Status resolved => closed