]> Cypherpunks repositories - gostls13.git/commitdiff
syscall: mark forkAndExecInChild1 noinline
authorAustin Clements <austin@google.com>
Tue, 20 Jun 2017 19:59:02 +0000 (15:59 -0400)
committerAustin Clements <austin@google.com>
Tue, 20 Jun 2017 21:54:19 +0000 (21:54 +0000)
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 <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/syscall/exec_linux.go

index db5236071762da3bf116873e9b122759e4ad684c..5cbabf789696b832c30c6aeba59f55abdffb174a 100644 (file)
@@ -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