From fc7ed45b35d24d6d67720e5085c083041a8dd30e Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Tue, 21 Feb 2012 16:36:15 -0500 Subject: [PATCH] runtime: avoid malloc during malloc A fault during malloc might lead to the program's first call to findfunc, which would in turn call malloc. Don't do that. Fixes #1777. R=golang-dev, gri CC=golang-dev https://golang.org/cl/5689047 --- src/pkg/runtime/symtab.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/pkg/runtime/symtab.c b/src/pkg/runtime/symtab.c index df4c9ad76cf..f29276bd7ff 100644 --- a/src/pkg/runtime/symtab.c +++ b/src/pkg/runtime/symtab.c @@ -437,13 +437,17 @@ runtime·findfunc(uintptr addr) // (Before enabling the signal handler, // SetCPUProfileRate calls findfunc to trigger // the initialization outside the handler.) - if(runtime·atomicload(&funcinit) == 0) { - runtime·lock(&funclock); - if(funcinit == 0) { - buildfuncs(); - runtime·atomicstore(&funcinit, 1); + // Avoid deadlock on fault during malloc + // by not calling buildfuncs if we're already in malloc. + if(!m->mallocing && !m->gcing) { + if(runtime·atomicload(&funcinit) == 0) { + runtime·lock(&funclock); + if(funcinit == 0) { + buildfuncs(); + runtime·atomicstore(&funcinit, 1); + } + runtime·unlock(&funclock); } - runtime·unlock(&funclock); } if(nfunc == 0)