git: 9front

Download patch

ref: 760800272441fbce6d9d96edac0d05d4c8eeb6ef
parent: 50e3fe630f34212dc9afaa468b766da05cbacde0
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Wed Apr 8 17:04:10 EDT 2015

pool: avoid triggering assert(b->magic != FREE_MAGIC) in blocksetsize() for mallocalignl()

when we trim the front of a block with freefromfront(),
the block magic of the back was not initialized which
could sometimes trigger the assert in blocksetsize()
to fail. fix is to just move the initialization of the
magic field before the blocksetsize() call.

the second b->magic = UNALLOC_MAGIC isnt really required
but just done for consistency with the trim() code above.

--- a/sys/src/libc/port/pool.c
+++ b/sys/src/libc/port/pool.c
@@ -520,10 +520,10 @@
 	skip = skip&~(p->quantum-1);
 	if(skip >= 0x1000 || (skip >= b->size>>2 && skip >= MINBLOCKSIZE && skip >= p->minblock)){
 		bb = (Alloc*)((uchar*)b+skip);
-		blocksetsize(bb, b->size-skip);
 		bb->magic = UNALLOC_MAGIC;
-		blocksetsize(b, skip);
+		blocksetsize(bb, b->size-skip);
 		b->magic = UNALLOC_MAGIC;
+		blocksetsize(b, skip);
 		pooladd(p, b);
 		return bb;
 	}
--