[dev.garbage] runtime: make sure G.param and SudoG.elem do not hold stale pointers
In old conservative Go, this could cause memory leaks.
A new pickier collector might reasonably crash when it saw one of these.
LGTM=rlh
R=rlh
CC=golang-codereviews
https://golang.org/cl/147480043
diff --git a/src/runtime/select.go b/src/runtime/select.go
index 7716d2d..1bcea8c 100644
--- a/src/runtime/select.go
+++ b/src/runtime/select.go
@@ -368,6 +368,7 @@
// someone woke us up
sellock(sel)
sg = (*sudog)(gp.param)
+ gp.param = nil
// pass 3 - dequeue from unsuccessful chans
// otherwise they stack up on quiet channels
@@ -376,6 +377,10 @@
// iterating through the linked list they are in reverse order.
cas = nil
sglist = gp.waiting
+ // Clear all elem before unlinking from gp.waiting.
+ for sg1 := gp.waiting; sg1 != nil; sg1 = sg1.waitlink {
+ sg1.elem = nil
+ }
gp.waiting = nil
for i := int(sel.ncase) - 1; i >= 0; i-- {
k = &scases[pollorder[i]]
@@ -506,6 +511,7 @@
if cas.elem != nil {
memmove(cas.elem, sg.elem, uintptr(c.elemsize))
}
+ sg.elem = nil
gp = sg.g
gp.param = unsafe.Pointer(sg)
if sg.releasetime != 0 {
@@ -541,6 +547,7 @@
if sg.elem != nil {
memmove(sg.elem, cas.elem, uintptr(c.elemsize))
}
+ sg.elem = nil
gp = sg.g
gp.param = unsafe.Pointer(sg)
if sg.releasetime != 0 {