From: Akshat Kumar Date: Tue, 17 Apr 2012 00:35:15 +0000 (-0700) Subject: syscall: fix duplicate fd bug for Plan 9 X-Git-Tag: go1.1rc2~3376 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=4cf577edf98fbb642840b55b474d9fd19b2f6606;p=gostls13.git syscall: fix duplicate fd bug for Plan 9 This change comes from CL 5536043, created by Andrey Mirtchovski. His description follows: "The plan9 exec child handler does not manage dup-ed fds from the parent correctly: when a dup-ed file descriptor appears in the child's fd list it is closed when first encountered and then subsequent attempt to dup it later in Pass 2 fails, resulting in 'fork/exec: fd out of range or not open'." R=golang-dev, rminnich, ality CC=golang-dev, mirtchovski, rsc https://golang.org/cl/6009046 --- diff --git a/src/pkg/syscall/exec_plan9.go b/src/pkg/syscall/exec_plan9.go index 7e4e180fa1..46131bb0cd 100644 --- a/src/pkg/syscall/exec_plan9.go +++ b/src/pkg/syscall/exec_plan9.go @@ -287,7 +287,13 @@ func forkAndExecInChild(argv0 *byte, argv []*byte, envv []envItem, dir *byte, at if int(r1) == -1 { goto childerror } - RawSyscall(SYS_CLOSE, uintptr(fd[i]), 0, 0) + } + + // Pass 3: close fds that were dup-ed + for i = 0; i < len(fd); i++ { + if fd[i] >= 0 && fd[i] != int(i) { + RawSyscall(SYS_CLOSE, uintptr(fd[i]), 0, 0) + } } // Time to exec.