From 2e4a035995e6d22871a27b7ad7c4b688a982b835 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Thu, 15 Mar 2012 22:17:54 -0400 Subject: [PATCH] runtime: do not handle signals before configuring handler There was a small window during program initialization where a signal could come in before the handling mechanisms were set up to handle it. Delay the signal-handler installation until we're ready for the signals. Fixes #3314. R=golang-dev, dsymonds, mikioh.mikioh CC=golang-dev https://golang.org/cl/5833049 --- src/pkg/runtime/proc.c | 8 +++++++- src/pkg/runtime/runtime.c | 8 +++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/pkg/runtime/proc.c b/src/pkg/runtime/proc.c index 844128c87c..962f748ce8 100644 --- a/src/pkg/runtime/proc.c +++ b/src/pkg/runtime/proc.c @@ -734,6 +734,12 @@ runtime·mstart(void) m->g0->sched.pc = (void*)-1; // make sure it is never used runtime·asminit(); runtime·minit(); + + // Install signal handlers; after minit so that minit can + // prepare the thread to be able to handle the signals. + if(m == &runtime·m0) + runtime·initsig(); + schedule(nil); } @@ -1161,7 +1167,7 @@ runtime·malg(int32 stacksize) { G *newg; byte *stk; - + if(StackTop < sizeof(Stktop)) { runtime·printf("runtime: SizeofStktop=%d, should be >=%d\n", (int32)StackTop, (int32)sizeof(Stktop)); runtime·throw("runtime: bad stack.h"); diff --git a/src/pkg/runtime/runtime.c b/src/pkg/runtime/runtime.c index afe8c5abeb..ebb5544fba 100644 --- a/src/pkg/runtime/runtime.c +++ b/src/pkg/runtime/runtime.c @@ -119,7 +119,7 @@ void runtime·panicstring(int8 *s) { Eface err; - + if(m->gcing) { runtime·printf("panic: %s\n", s); runtime·throw("panic during gc"); @@ -189,7 +189,7 @@ runtime·goargs(void) { String *s; int32 i; - + // for windows implementation see "os" package if(Windows) return; @@ -207,7 +207,7 @@ runtime·goenvs_unix(void) { String *s; int32 i, n; - + for(n=0; argv[argc+1+n] != 0; n++) ; @@ -342,8 +342,6 @@ runtime·check(void) runtime·throw("float32nan2"); if(!(i != i1)) runtime·throw("float32nan3"); - - runtime·initsig(); } void