]> Cypherpunks repositories - gostls13.git/commitdiff
syscall: fix duplicate fd bug for Plan 9
authorAkshat Kumar <seed@mail.nanosouffle.net>
Tue, 17 Apr 2012 00:35:15 +0000 (17:35 -0700)
committerAnthony Martin <ality@pbrane.org>
Tue, 17 Apr 2012 00:35:15 +0000 (17:35 -0700)
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

index 7e4e180fa17c13118a1f9cfdf3f9d66ac0386d4d..46131bb0cdebec57b08488d7a666130ec19307de 100644 (file)
@@ -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.