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
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.