From e9bbe3a8da9043e13b74ec4427608364b068bed7 Mon Sep 17 00:00:00 2001 From: Jan Ziak <0xe2.0x9a.0x9b@gmail.com> Date: Thu, 25 Apr 2013 13:39:09 +0200 Subject: [PATCH] runtime: prevent the GC from seeing the content of a frame in runfinq() Fixes #5348. R=golang-dev, dvyukov CC=golang-dev https://golang.org/cl/8954044 --- src/pkg/runtime/mgc0.c | 2 +- test/fixedbugs/issue5348.go | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 test/fixedbugs/issue5348.go diff --git a/src/pkg/runtime/mgc0.c b/src/pkg/runtime/mgc0.c index f9dbdbb4a1..6369da2720 100644 --- a/src/pkg/runtime/mgc0.c +++ b/src/pkg/runtime/mgc0.c @@ -2191,7 +2191,7 @@ runfinq(void) framesz = sizeof(uintptr) + f->nret; if(framecap < framesz) { runtime·free(frame); - frame = runtime·mal(framesz); + frame = runtime·mallocgc(framesz, FlagNoPointers, 0, 1); framecap = framesz; } *(void**)frame = f->arg; diff --git a/test/fixedbugs/issue5348.go b/test/fixedbugs/issue5348.go new file mode 100644 index 0000000000..94c3d5d15f --- /dev/null +++ b/test/fixedbugs/issue5348.go @@ -0,0 +1,37 @@ +// run + +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 5348: finalizers keep data live for a surprising amount of time + +package main + +import ( + "runtime" +) + +type T struct { + S *string +} + +func newString(s string) *string { + return &s +} + +var c = make(chan int) + +func foo() { + t := &T{S: newString("foo")} + runtime.SetFinalizer(t, func(p *T) { c <- 0 }) + runtime.SetFinalizer(t.S, func(p *string) { c <- 0 }) +} + +func main() { + foo() + runtime.GC() + <-c + runtime.GC() + <-c +} -- 2.48.1