From 8d321625fdae77d7e4a8c1681fe90bd893b9cdd2 Mon Sep 17 00:00:00 2001 From: Dmitriy Vyukov Date: Fri, 14 Mar 2014 23:25:48 +0400 Subject: runtime: fix spans corruption The problem was that spans end up in wrong lists after split (e.g. in h->busy instead of h->central->empty). Also the span can be non-swept before split, I don't know what it can cause, but it's safer to operate on swept spans. Fixes #7544. R=golang-codereviews, rsc CC=golang-codereviews, khr https://golang.org/cl/76160043 --- src/pkg/runtime/stack.c | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) (limited to 'src/pkg/runtime/stack.c') diff --git a/src/pkg/runtime/stack.c b/src/pkg/runtime/stack.c index c0b98634d7..c73991470e 100644 --- a/src/pkg/runtime/stack.c +++ b/src/pkg/runtime/stack.c @@ -838,15 +838,7 @@ runtime·shrinkstack(G *gp) // First, we trick malloc into thinking // we allocated the stack as two separate half-size allocs. Then the // free() call does the rest of the work for us. - if(oldsize == PageSize) { - // convert span of 1 PageSize object to a span of 2 - // PageSize/2 objects. - span->ref = 2; - span->sizeclass = runtime·SizeToClass(PageSize/2); - span->elemsize = PageSize/2; - } else { - // convert span of n>1 pages into two spans of n/2 pages each. - runtime·MHeap_SplitSpan(&runtime·mheap, span); - } + runtime·MSpan_EnsureSwept(span); + runtime·MHeap_SplitSpan(&runtime·mheap, span); runtime·free(oldstk); } -- cgit v1.3