From 4cf577edf98fbb642840b55b474d9fd19b2f6606 Mon Sep 17 00:00:00 2001 From: Akshat Kumar Date: Mon, 16 Apr 2012 17:35:15 -0700 Subject: [PATCH] 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 --- src/pkg/syscall/exec_plan9.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) 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.