aboutsummaryrefslogtreecommitdiff
path: root/src/pkg/runtime/panic.c
diff options
context:
space:
mode:
authorDmitriy Vyukov <dvyukov@google.com>2013-07-01 17:36:08 -0400
committerRuss Cox <rsc@golang.org>2013-07-01 17:36:08 -0400
commitfd23958f49f0967c9a5999ffc2e33740f246a11a (patch)
tree5b08e4b8b266c064c90be0652ca4974bae9f9b67 /src/pkg/runtime/panic.c
parent20498ed772ef5791a17248f1198b58265299574e (diff)
downloadgo-fd23958f49f0967c9a5999ffc2e33740f246a11a.tar.xz
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
Diffstat (limited to 'src/pkg/runtime/panic.c')
-rw-r--r--src/pkg/runtime/panic.c6
1 files changed, 5 insertions, 1 deletions
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);
}
}