diff options
| author | Dmitriy Vyukov <dvyukov@google.com> | 2014-03-13 17:41:08 +0400 |
|---|---|---|
| committer | Dmitriy Vyukov <dvyukov@google.com> | 2014-03-13 17:41:08 +0400 |
| commit | e678ab4e375659fea86b17557c23673033cf897c (patch) | |
| tree | 4572fb56152de8e44ae6482a9a45cd2743220ecd /src/pkg/runtime/proc.c | |
| parent | 156962872575382697a0487030cd5777312d6d0c (diff) | |
| download | go-e678ab4e375659fea86b17557c23673033cf897c.tar.xz | |
runtime: detect stack split after fork
This check would allowed to easily prevent issue 7511.
Update #7511
LGTM=rsc
R=rsc, aram
CC=golang-codereviews
https://golang.org/cl/75260043
Diffstat (limited to 'src/pkg/runtime/proc.c')
| -rw-r--r-- | src/pkg/runtime/proc.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/src/pkg/runtime/proc.c b/src/pkg/runtime/proc.c index d3ad740136..e11f9b18ac 100644 --- a/src/pkg/runtime/proc.c +++ b/src/pkg/runtime/proc.c @@ -1704,14 +1704,28 @@ syscall·runtime_BeforeFork(void) m->locks++; if(m->profilehz != 0) runtime·resetcpuprofiler(0); + + // This function is called before fork in syscall package. + // Code between fork and exec must not allocate memory nor even try to grow stack. + // Here we spoil g->stackguard to reliably detect any attempts to grow stack. + // runtime_AfterFork will undo this in parent process, but not in child. + m->forkstackguard = g->stackguard; + g->stackguard0 = StackPreempt-1; + g->stackguard = StackPreempt-1; } // Called from syscall package after fork in parent. +#pragma textflag NOSPLIT void syscall·runtime_AfterFork(void) { int32 hz; + // See the comment in runtime_BeforeFork. + g->stackguard0 = m->forkstackguard; + g->stackguard = m->forkstackguard; + m->forkstackguard = 0; + hz = runtime·sched.profilehz; if(hz != 0) runtime·resetcpuprofiler(hz); |
