summaryrefslogtreecommitdiff
path: root/src/syscall/exec_unix.go
diff options
context:
space:
mode:
authorShawn Walker-Salas <shawn.walker@oracle.com>2017-06-28 10:58:44 -0700
committerBrad Fitzpatrick <bradfitz@golang.org>2017-06-28 19:02:05 +0000
commit2d1bd1fe9d2c08ecc2ba710fe80e226e80db966f (patch)
tree21a16e252f91c53e4eacff5b965af57b714561ac /src/syscall/exec_unix.go
parentcfb8404e76f94b8bf97188a4470541e9d1ddafa4 (diff)
downloadgo-git-2d1bd1fe9d2c08ecc2ba710fe80e226e80db966f.tar.gz
syscall: fix Exec on solaris
The test added for issue #18146 exposed a long-existing bug in the Solaris port; notably, that syscall.Exec uses RawSyscall -- which is not actually functional for the Solaris port (intentionally) and only exists as a placebo to satisfy build requirements. Call syscall.execve instead for Solaris. Fixes #20832 Change-Id: I327d863f4bbbbbb6e5ecf66b82152c4030825d09 Reviewed-on: https://go-review.googlesource.com/47032 Run-TryBot: Shawn Walker-Salas <shawn.walker@oracle.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Diffstat (limited to 'src/syscall/exec_unix.go')
-rw-r--r--src/syscall/exec_unix.go24
1 files changed, 19 insertions, 5 deletions
diff --git a/src/syscall/exec_unix.go b/src/syscall/exec_unix.go
index e8ca29ab40..9a950ac17f 100644
--- a/src/syscall/exec_unix.go
+++ b/src/syscall/exec_unix.go
@@ -246,6 +246,10 @@ func StartProcess(argv0 string, argv []string, attr *ProcAttr) (pid int, handle
func runtime_BeforeExec()
func runtime_AfterExec()
+// execveSolaris is non-nil on Solaris, set to execve in exec_solaris.go; this
+// avoids a build dependency for other platforms.
+var execveSolaris func(path uintptr, argv uintptr, envp uintptr) (err Errno)
+
// Exec invokes the execve(2) system call.
func Exec(argv0 string, argv []string, envv []string) (err error) {
argv0p, err := BytePtrFromString(argv0)
@@ -261,10 +265,20 @@ func Exec(argv0 string, argv []string, envv []string) (err error) {
return err
}
runtime_BeforeExec()
- _, _, err1 := RawSyscall(SYS_EXECVE,
- uintptr(unsafe.Pointer(argv0p)),
- uintptr(unsafe.Pointer(&argvp[0])),
- uintptr(unsafe.Pointer(&envvp[0])))
+
+ var err1 Errno
+ if runtime.GOOS == "solaris" {
+ // RawSyscall should never be used on Solaris.
+ err1 = execveSolaris(
+ uintptr(unsafe.Pointer(argv0p)),
+ uintptr(unsafe.Pointer(&argvp[0])),
+ uintptr(unsafe.Pointer(&envvp[0])))
+ } else {
+ _, _, err1 = RawSyscall(SYS_EXECVE,
+ uintptr(unsafe.Pointer(argv0p)),
+ uintptr(unsafe.Pointer(&argvp[0])),
+ uintptr(unsafe.Pointer(&envvp[0])))
+ }
runtime_AfterExec()
- return Errno(err1)
+ return err1
}