shithub: riscv

Download patch

ref: ca4e12839aa7234104c5d455046c8ea20af64dec
parent: adfb8dff26976e201208f3f8ddc3cdc1d34cd8cb
author: cinap_lenrek <[email protected]>
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;
 	}