]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: keep cleanup closure alive across adding the cleanup special
authorMichael Anthony Knyszek <mknyszek@google.com>
Wed, 20 Nov 2024 19:24:56 +0000 (19:24 +0000)
committerGopher Robot <gobot@golang.org>
Wed, 20 Nov 2024 19:50:09 +0000 (19:50 +0000)
This is similar to the weak handle bug in #70455. In short, there's a
window where a heap-allocated value is only visible through a special
that has not been made visible to the GC yet.

For #70455.

Change-Id: Ic2bb2c60d422a5bc5dab8d971cfc26ff6d7622bc
Reviewed-on: https://go-review.googlesource.com/c/go/+/630277
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Auto-Submit: Michael Knyszek <mknyszek@google.com>
Reviewed-by: Carlos Amedee <carlos@golang.org>
src/runtime/mheap.go

index 0c3d6e669e773196c30ef3ffec5ea0fefa18cb2a..4b9734da5f6465bfdd5481748b83f4f4d885f5c0 100644 (file)
@@ -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
 }