diff options
author | ian <ian@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-09-20 21:00:07 +0000 |
---|---|---|
committer | ian <ian@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-09-20 21:00:07 +0000 |
commit | 537d474e4feb7f52f97d848f68724553684bf69e (patch) | |
tree | ef020738a977887d068fec88173fa59aff82bb42 /libgo/syscalls/exec.go | |
parent | d6ef1dfb711f7cddc6cde1445ddba7b5fac3465a (diff) | |
download | gcc-537d474e4feb7f52f97d848f68724553684bf69e.tar.gz |
Implement goto restrictions.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@179018 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libgo/syscalls/exec.go')
-rw-r--r-- | libgo/syscalls/exec.go | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/libgo/syscalls/exec.go b/libgo/syscalls/exec.go index 04d0ef88f82..8ad45f9aea5 100644 --- a/libgo/syscalls/exec.go +++ b/libgo/syscalls/exec.go @@ -231,6 +231,7 @@ var zeroSysProcAttr SysProcAttr func forkExec(argv0 string, argv []string, attr *ProcAttr) (pid int, err int) { var p [2]int + var n Ssize_t var r1 int var err1 uintptr var wstatus WaitStatus @@ -283,20 +284,14 @@ func forkExec(argv0 string, argv []string, attr *ProcAttr) (pid int, err int) { // Kick off child. pid, err = forkAndExecInChild(argv0p, argvp, envvp, chroot, dir, attr, sys, p[1]) if err != 0 { - error: - if p[0] >= 0 { - Close(p[0]) - Close(p[1]) - } - ForkLock.Unlock() - return 0, err + goto error } ForkLock.Unlock() // Read child error status from pipe. Close(p[1]) - n := libc_read(p[0], (*byte)(unsafe.Pointer(&err1)), - Size_t(unsafe.Sizeof(err1))) + n = libc_read(p[0], (*byte)(unsafe.Pointer(&err1)), + Size_t(unsafe.Sizeof(err1))) err = 0 if n < 0 { err = GetErrno() @@ -321,6 +316,14 @@ func forkExec(argv0 string, argv []string, attr *ProcAttr) (pid int, err int) { // Read got EOF, so pipe closed on exec, so exec succeeded. return pid, 0 + +error: + if p[0] >= 0 { + Close(p[0]) + Close(p[1]) + } + ForkLock.Unlock() + return 0, err } // Combination of fork and exec, careful to be thread safe. |