aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/stack.go
diff options
context:
space:
mode:
authorAustin Clements <austin@google.com>2016-10-23 21:53:44 -0400
committerAustin Clements <austin@google.com>2016-10-26 15:46:25 +0000
commit3193c71c5b97c1e770f587f50824b266f04b71d8 (patch)
treea938123ca2b37977d2521234e05cb5a9df08dc51 /src/runtime/stack.go
parentd1cc83472d611a17513795676d650276f823cafd (diff)
downloadgo-3193c71c5b97c1e770f587f50824b266f04b71d8.tar.xz
runtime: fix bad pointer with 0 stack barriers
Currently, if the number of stack barriers for a stack is 0, we'll create a zero-length slice that points just past the end of the stack allocation. This bad pointer causes GC panics. Fix this by creating a nil slice if the stack barrier count is 0. In practice, the only way this can happen is if GODEBUG=gcstackbarrieroff=1 is set because even the minimum size stack reserves space for two stack barriers. Change-Id: I3527c9a504c445b64b81170ee285a28594e7983d Reviewed-on: https://go-review.googlesource.com/31762 Reviewed-by: Rick Hudson <rlh@golang.org>
Diffstat (limited to 'src/runtime/stack.go')
-rw-r--r--src/runtime/stack.go9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/runtime/stack.go b/src/runtime/stack.go
index 49499d4433..e803dc17a0 100644
--- a/src/runtime/stack.go
+++ b/src/runtime/stack.go
@@ -335,6 +335,7 @@ func stackalloc(n uint32) (stack, []stkbar) {
// Compute the size of stack barrier array.
maxstkbar := gcMaxStackBarriers(int(n))
nstkbar := unsafe.Sizeof(stkbar{}) * uintptr(maxstkbar)
+ var stkbarSlice slice
if debug.efence != 0 || stackFromSystem != 0 {
v := sysAlloc(round(uintptr(n), _PageSize), &memstats.stacks_sys)
@@ -342,7 +343,9 @@ func stackalloc(n uint32) (stack, []stkbar) {
throw("out of memory (stackalloc)")
}
top := uintptr(n) - nstkbar
- stkbarSlice := slice{add(v, top), 0, maxstkbar}
+ if maxstkbar != 0 {
+ stkbarSlice = slice{add(v, top), 0, maxstkbar}
+ }
return stack{uintptr(v), uintptr(v) + top}, *(*[]stkbar)(unsafe.Pointer(&stkbarSlice))
}
@@ -410,7 +413,9 @@ func stackalloc(n uint32) (stack, []stkbar) {
print(" allocated ", v, "\n")
}
top := uintptr(n) - nstkbar
- stkbarSlice := slice{add(v, top), 0, maxstkbar}
+ if maxstkbar != 0 {
+ stkbarSlice = slice{add(v, top), 0, maxstkbar}
+ }
return stack{uintptr(v), uintptr(v) + top}, *(*[]stkbar)(unsafe.Pointer(&stkbarSlice))
}