diff options
| author | Austin Clements <austin@google.com> | 2016-10-23 21:53:44 -0400 |
|---|---|---|
| committer | Austin Clements <austin@google.com> | 2016-10-26 15:46:25 +0000 |
| commit | 3193c71c5b97c1e770f587f50824b266f04b71d8 (patch) | |
| tree | a938123ca2b37977d2521234e05cb5a9df08dc51 /src/runtime/stack.go | |
| parent | d1cc83472d611a17513795676d650276f823cafd (diff) | |
| download | go-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.go | 9 |
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)) } |
