Small tweak. Use a union, instead of casts. There's still casting for the call to insert(), but I think this is a little better. Also use the correct type for the insert() parameter.
Index: stdlib/malloc.c =================================================================== RCS file: /cvs/src/lib/libc/stdlib/malloc.c,v retrieving revision 1.152 diff -u -p -r1.152 malloc.c --- stdlib/malloc.c 3 Apr 2014 16:18:11 -0000 1.152 +++ stdlib/malloc.c 14 Apr 2014 17:37:21 -0000 @@ -94,7 +94,10 @@ struct region_info { void *p; /* page; low bits used to mark chunks */ - uintptr_t size; /* size for pages, or chunk_info pointer */ + union { + size_t size; /* size for pages */ + struct chunk_info *info;/* chunk_info pointer */ + }; #ifdef MALLOC_STATS void *f; /* where allocated from */ #endif @@ -737,7 +740,7 @@ alloc_chunk_info(struct dir_info *d, int * non-MAP_FIXED mappings with hint 0 start at BRKSIZ. */ static int -insert(struct dir_info *d, void *p, size_t sz, void *f) +insert(struct dir_info *d, void *p, uintptr_t sz, void *f) { size_t index; size_t mask; @@ -985,7 +988,7 @@ free_bytes(struct dir_info *d, struct re struct chunk_info *info; int i; - info = (struct chunk_info *)r->size; + info = r->info; if (info->canary != d->canary1) wrterror("chunk info corrupted", NULL);