diff options
| author | Dmitriy Vyukov <dvyukov@google.com> | 2013-07-01 17:36:08 -0400 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2013-07-01 17:36:08 -0400 |
| commit | fd23958f49f0967c9a5999ffc2e33740f246a11a (patch) | |
| tree | 5b08e4b8b266c064c90be0652ca4974bae9f9b67 /src/pkg/runtime/panic.c | |
| parent | 20498ed772ef5791a17248f1198b58265299574e (diff) | |
| download | go-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.c | 6 |
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); } } |
