Add calls to setmalloctag() in libc where it wraps malloc and friends. This ensures leak(1) will point to the buggy user code rather than the innocent library code. -Steve Reference: /n/sources/patch/applied/malloc-tags Date: Fri Jan 4 17:22:16 CET 2013 Signed-off-by: steve@quintile.net --- /sys/src/libc/fmt/runevsmprint.c Fri Jan 4 17:17:36 2013 +++ /sys/src/libc/fmt/runevsmprint.c Fri Jan 4 17:17:33 2013 @@ -38,6 +38,7 @@ f->start = malloc(sizeof(Rune)*n); if(f->start == nil) return -1; + setmalloctag(f->start, getcallerpc(&f)); f->to = f->start; f->stop = (Rune*)f->start + n - 1; f->flush = runeFmtStrFlush; --- /sys/src/libc/fmt/vsmprint.c Fri Jan 4 17:17:41 2013 +++ /sys/src/libc/fmt/vsmprint.c Fri Jan 4 17:17:38 2013 @@ -38,6 +38,7 @@ f->start = malloc(n); if(f->start == nil) return -1; + setmalloctag(f->start, getcallerpc(&f)); f->to = f->start; f->stop = (char*)f->start + n - 1; f->flush = fmtStrFlush; @@ -57,6 +58,7 @@ if(fmtstrinit(&f) < 0) return nil; + setmalloctag(f.start, getcallerpc(&fmt)); f.args = args; n = dofmt(&f, fmt); if(f.start == nil) --- /sys/src/libc/port/runestrdup.c Fri Jan 4 17:17:47 2013 +++ /sys/src/libc/port/runestrdup.c Fri Jan 4 17:17:43 2013 @@ -9,6 +9,7 @@ ns = malloc(sizeof(Rune)*(runestrlen(s) + 1)); if(ns == 0) return 0; + setmalloctag(ns, getcallerpc(&s)); return runestrcpy(ns, s); } --- /sys/src/libc/port/strdup.c Fri Jan 4 17:17:52 2013 +++ /sys/src/libc/port/strdup.c Fri Jan 4 17:17:49 2013 @@ -9,6 +9,7 @@ ns = malloc(strlen(s) + 1); if(ns == 0) return 0; + setmalloctag(ns, getcallerpc(&s)); return strcpy(ns, s); }