aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/select.go
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2014-10-03 15:33:29 -0400
committerRuss Cox <rsc@golang.org>2014-10-03 15:33:29 -0400
commit13da3608453f7d50c0c810d5a0df79691bca8b64 (patch)
treeb0a7d7bc0041d478e3e5e2f45a54c7582414d67f /src/runtime/select.go
parent0120f8378d4de043471fc948fca765abd51a9f4c (diff)
downloadgo-13da3608453f7d50c0c810d5a0df79691bca8b64.tar.xz
runtime: clear sg.selectdone before saving in SudoG cache
Removes another dangling pointer that might cause a memory leak in 1.4 or crash the GC in 1.5. LGTM=rlh R=golang-codereviews CC=golang-codereviews, iant, khr, r, rlh https://golang.org/cl/150520043
Diffstat (limited to 'src/runtime/select.go')
-rw-r--r--src/runtime/select.go8
1 files changed, 7 insertions, 1 deletions
diff --git a/src/runtime/select.go b/src/runtime/select.go
index 1bcea8c4b4..9de057b871 100644
--- a/src/runtime/select.go
+++ b/src/runtime/select.go
@@ -377,8 +377,14 @@ loop:
// iterating through the linked list they are in reverse order.
cas = nil
sglist = gp.waiting
- // Clear all elem before unlinking from gp.waiting.
+ // Clear all selectdone and elem before unlinking from gp.waiting.
+ // They must be cleared before being put back into the sudog cache.
+ // Clear before unlinking, because if a stack copy happens after the unlink,
+ // they will not be updated, they will be left pointing to the old stack,
+ // which creates dangling pointers, which may be detected by the
+ // garbage collector.
for sg1 := gp.waiting; sg1 != nil; sg1 = sg1.waitlink {
+ sg1.selectdone = nil
sg1.elem = nil
}
gp.waiting = nil