From fd23958f49f0967c9a5999ffc2e33740f246a11a Mon Sep 17 00:00:00 2001 From: Dmitriy Vyukov Date: Mon, 1 Jul 2013 17:36:08 -0400 Subject: runtime: fix memory leaks due to defers fn can clearly hold a closure in memory. argp/pc point into stack and so can hold in memory a block that was previously a large stack serment. R=golang-dev, dave, rsc CC=golang-dev https://golang.org/cl/10784043 --- src/pkg/runtime/panic.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'src/pkg/runtime/panic.c') diff --git a/src/pkg/runtime/panic.c b/src/pkg/runtime/panic.c index 963063a8e8..8ec8078d22 100644 --- a/src/pkg/runtime/panic.c +++ b/src/pkg/runtime/panic.c @@ -104,11 +104,15 @@ popdefer(void) static void freedefer(Defer *d) { + int32 total; + if(d->special) { if(d->free) runtime·free(d); } else { - runtime·memclr((byte*)d->args, d->siz); + // Wipe out any possible pointers in argp/pc/fn/args. + total = sizeof(*d) + ROUND(d->siz, sizeof(uintptr)) - sizeof(d->args); + runtime·memclr((byte*)d, total); } } -- cgit v1.3-5-g9baa