From 87adaf4c084e0ceba6444fddaf468165e0201fa1 Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Tue, 20 Jun 2017 15:59:02 -0400 Subject: [PATCH] syscall: mark forkAndExecInChild1 noinline This certainly won't get inlined right now, but in the spirit of making this more robust, we have to disable inlining because inlining would defeat the purpose of separating forkAndExecInChild1 into a separate function. Updates #20732. Change-Id: I736c3f909cc42c5f5783740c2e19ba4827c7c2ec Reviewed-on: https://go-review.googlesource.com/46174 Run-TryBot: Austin Clements TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/syscall/exec_linux.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/syscall/exec_linux.go b/src/syscall/exec_linux.go index db52360717..5cbabf7896 100644 --- a/src/syscall/exec_linux.go +++ b/src/syscall/exec_linux.go @@ -90,6 +90,15 @@ func forkAndExecInChild(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr return pid, 0 } +// forkAndExecInChild1 implements the body of forkAndExecInChild up to +// the parent's post-fork path. This is a separate function so we can +// separate the child's and parent's stack frames if we're using +// vfork. +// +// This is go:noinline because the point is to keep the stack frames +// of this and forkAndExecInChild separate. +// +//go:noinline //go:norace func forkAndExecInChild1(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr *ProcAttr, sys *SysProcAttr, pipe int) (r1 uintptr, err1 Errno, p [2]int, locked bool) { // vfork requires that the child not touch any of the parent's