]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: fix bad pointer with 0 stack barriers
authorAustin Clements <austin@google.com>
Mon, 24 Oct 2016 01:53:44 +0000 (21:53 -0400)
committerAustin Clements <austin@google.com>
Wed, 26 Oct 2016 15:46:25 +0000 (15:46 +0000)
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>
src/runtime/stack.go

index 49499d4433b488d22d1a032ddba689998f795bfd..e803dc17a0df81a8fb296b07d80cb9922168a759 100644 (file)
@@ -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))
 }