Patchwork libgo patch committed: Record g0 top of stack correctly when not split

login
register
mail settings
Submitter Ian Taylor
Date Feb. 10, 2012, 3:55 p.m.
Message ID <mcripjen0n6.fsf@dhcp-172-18-216-180.mtv.corp.google.com>
Download mbox | patch
Permalink /patch/140680/
State New
Headers show

Comments

Ian Taylor - Feb. 10, 2012, 3:55 p.m.
This patch to libgo records the top of the g0 goroutine stack correctly
when not using -fsplit-stack.  Without this patch the garbage collector
would scan beyond the top of the stack when looking at the g0 stack,
which could cause segmentation violations.  Bootstrapped and ran Go
testsuite on x86_64-unknown-linux-gnu.  Committed to mainline.

Ian

Patch

diff -r 971ec6345e64 libgo/runtime/proc.c
--- a/libgo/runtime/proc.c	Fri Feb 10 07:50:54 2012 -0800
+++ b/libgo/runtime/proc.c	Fri Feb 10 07:52:48 2012 -0800
@@ -909,7 +909,9 @@ 
 	__splitstack_getcontext(&g->stack_context[0]);
 #else
 	g->gcinitial_sp = &mp;
-	g->gcstack_size = StackMin;
+	// Setting gcstack_size to 0 is a marker meaning that gcinitial_sp
+	// is the top of the stack, not the bottom.
+	g->gcstack_size = 0;
 	g->gcnext_sp = &mp;
 #endif
 	getcontext(&g->context);
@@ -1267,6 +1269,8 @@ 
 #else
 		sp = newg->gcinitial_sp;
 		spsize = newg->gcstack_size;
+		if(spsize == 0)
+			runtime_throw("bad spsize in __go_go");
 		newg->gcnext_sp = sp;
 #endif
 	} else {