]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: initialize more fields of stack spans
authorAustin Clements <austin@google.com>
Thu, 16 Mar 2017 18:55:10 +0000 (14:55 -0400)
committerAustin Clements <austin@google.com>
Wed, 5 Apr 2017 19:17:41 +0000 (19:17 +0000)
Stack spans don't internally use many of the fields of the mspan,
which means things like the size class and element size get left over
from whatever last used the mspan. This can lead to confusing crashes
and debugging.

Zero these fields or initialize them to something reasonable. This
also lets us simplify some code that currently has to distinguish
between heap and stack spans.

Change-Id: I9bd114e76c147bb32de497045b932f8bf1988bbf
Reviewed-on: https://go-review.googlesource.com/38573
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rick Hudson <rlh@golang.org>
src/runtime/mheap.go
src/runtime/stack.go

index 6888406bee887b40c0e2e4018462a91e1a48022d..df621549aa66a6d10547e13313d05bc69dded443 100644 (file)
@@ -326,10 +326,8 @@ func inHeapOrStack(b uintptr) bool {
                return false
        }
        switch s.state {
-       case mSpanInUse:
+       case mSpanInUse, _MSpanStack:
                return b < s.limit
-       case _MSpanStack:
-               return b < s.base()+s.npages<<_PageShift
        default:
                return false
        }
@@ -653,6 +651,10 @@ func (h *mheap) allocStack(npage uintptr) *mspan {
                s.state = _MSpanStack
                s.stackfreelist = 0
                s.allocCount = 0
+               s.sizeclass = 0
+               s.nelems = 0
+               s.elemsize = 0
+               s.limit = s.base() + s.npages<<_PageShift
                memstats.stacks_inuse += uint64(s.npages << _PageShift)
        }
 
index 830316b69aaed7f6235ca654e70c05f97cf73ef9..e81bb5ba4c894b45197234e1a6fdbefdb191f424 100644 (file)
@@ -196,7 +196,8 @@ func stackpoolalloc(order uint8) gclinkptr {
                if s.stackfreelist.ptr() != nil {
                        throw("bad stackfreelist")
                }
-               for i := uintptr(0); i < _StackCacheSize; i += _FixedStack << order {
+               s.elemsize = _FixedStack << order
+               for i := uintptr(0); i < _StackCacheSize; i += s.elemsize {
                        x := gclinkptr(s.base() + i)
                        x.ptr().next = s.stackfreelist
                        s.stackfreelist = x
@@ -393,6 +394,7 @@ func stackalloc(n uint32) stack {
                        if s == nil {
                                throw("out of memory")
                        }
+                       s.elemsize = uintptr(n)
                }
                v = unsafe.Pointer(s.base())
        }