diff --git a/src/runtime/mheap.go b/src/runtime/mheap.go index 0c3d6e669e..4b9734da5f 100644 --- a/src/runtime/mheap.go +++ b/src/runtime/mheap.go @@ -2057,6 +2057,11 @@ func addCleanup(p unsafe.Pointer, f *funcval) uint64 { // special isn't part of the GC'd heap. scanblock(uintptr(unsafe.Pointer(&s.fn)), goarch.PtrSize, &oneptrmask[0], gcw, nil) } + // Keep f alive. There's a window in this function where it's + // only reachable via the special while the special hasn't been + // added to the specials list yet. This is similar to a bug + // discovered for weak handles, see #70455. + KeepAlive(f) return id }