summaryrefslogtreecommitdiff
path: root/libgo/syscalls/exec.go
diff options
context:
space:
mode:
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>2011-09-20 21:00:07 +0000
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>2011-09-20 21:00:07 +0000
commit537d474e4feb7f52f97d848f68724553684bf69e (patch)
treeef020738a977887d068fec88173fa59aff82bb42 /libgo/syscalls/exec.go
parentd6ef1dfb711f7cddc6cde1445ddba7b5fac3465a (diff)
downloadgcc-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.go21
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.