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;
}
--
⑨