Hi, survived a make build on amd64 and armv7 here. Note that canaries are always enabled in ld.so's malloc.
ok? -Otto Index: malloc.c =================================================================== RCS file: /cvs/src/libexec/ld.so/malloc.c,v retrieving revision 1.14 diff -u -p -r1.14 malloc.c --- malloc.c 14 Oct 2016 17:35:39 -0000 1.14 +++ malloc.c 22 Oct 2016 12:01:35 -0000 @@ -735,6 +735,22 @@ malloc_bytes(struct dir_info *d, size_t return ((char *)bp->page + k); } +static void +validate_canary(struct dir_info *d, u_char *ptr, size_t sz, size_t allocated) +{ + size_t check_sz = allocated - sz; + u_char *p, *q; + + if (check_sz > CHUNK_CHECK_LENGTH) + check_sz = CHUNK_CHECK_LENGTH; + p = ptr + sz; + q = p + check_sz; + + while (p < q) + if (*p++ != SOME_JUNK) + wrterror("chunk canary corrupted"); +} + static uint32_t find_chunknum(struct dir_info *d, struct region_info *r, void *ptr, int check) { @@ -748,18 +764,8 @@ find_chunknum(struct dir_info *d, struct /* Find the chunk number on the page */ chunknum = ((uintptr_t)ptr & MALLOC_PAGEMASK) >> info->shift; if (check && mopts.chunk_canaries && info->size > 0) { - size_t sz = info->bits[info->offset + chunknum]; - size_t check_sz = info->size - sz; - u_char *p, *q; - - if (check_sz > CHUNK_CHECK_LENGTH) - check_sz = CHUNK_CHECK_LENGTH; - p = (u_char *)ptr + sz; - q = p + check_sz; - - while (p < q) - if (*p++ != SOME_JUNK) - wrterror("chunk canary corrupted"); + validate_canary(d, ptr, info->bits[info->offset + chunknum], + info->size); } if ((uintptr_t)ptr & ((1U << (info->shift)) - 1)) { @@ -866,6 +872,13 @@ omalloc(size_t sz, int zero_fill) else _dl_memset(p, SOME_JUNK, psz - mopts.malloc_guard); + } else if (mopts.chunk_canaries) { + size_t csz = psz - sz; + + if (csz > CHUNK_CHECK_LENGTH) + csz = CHUNK_CHECK_LENGTH; + _dl_memset((char *)p + sz - mopts.malloc_guard, + SOME_JUNK, csz); } } @@ -951,6 +964,10 @@ ofree(void *p) MALLOC_LEEWAY) { if (r->p != p) wrterror("bogus pointer"); + if (mopts.chunk_canaries) + validate_canary(g_pool, p, + sz - mopts.malloc_guard, + PAGEROUND(sz - mopts.malloc_guard)); } else { #if notyetbecause_of_realloc /* shifted towards the end */