syscall: use fcntl F_DUP2FD_CLOEXEC in forkAndExecInChild on solaris

Use fcntl(oldfd, F_DUP2FD_CLOEXEC, newfd) to duplicate the file
descriptor and mark is as close-on-exec instead of dup2 & fcntl.

Note that the value for F_DUP2FD_CLOEXEC is different on Solaris and
Illumos and thus the definition is moved from zerrors_solaris_amd64.go
to solaris/illumos specific files.

Change-Id: I9a52801d1a01471ec3f065520575e3fafee92855
Reviewed-on: https://go-review.googlesource.com/c/go/+/428375
Run-TryBot: Tobias Klauser <tobias.klauser@gmail.com>
Auto-Submit: Jenny Rakoczy <jenny@golang.org>
Reviewed-by: Ian Lance Taylor <iant@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Jenny Rakoczy <jenny@golang.org>
Run-TryBot: Jenny Rakoczy <jenny@golang.org>
Run-TryBot: Ian Lance Taylor <iant@google.com>
This commit is contained in:
Tobias Klauser 2022-09-14 10:45:15 +02:00 committed by Gopher Robot
parent e0822b55ac
commit a7db14241c
5 changed files with 17 additions and 7 deletions

View file

@ -199,7 +199,7 @@ func forkAndExecInChild(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr
// so that pass 2 won't stomp on an fd it needs later.
if pipe < nextfd {
switch runtime.GOOS {
case "illumos":
case "illumos", "solaris":
_, err1 = fcntl1(uintptr(pipe), _F_DUP2FD_CLOEXEC, uintptr(nextfd))
default:
_, err1 = dup2child(uintptr(pipe), uintptr(nextfd))
@ -220,7 +220,7 @@ func forkAndExecInChild(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr
nextfd++
}
switch runtime.GOOS {
case "illumos":
case "illumos", "solaris":
_, err1 = fcntl1(uintptr(fd[i]), _F_DUP2FD_CLOEXEC, uintptr(nextfd))
default:
_, err1 = dup2child(uintptr(fd[i]), uintptr(nextfd))

View file

@ -4,12 +4,13 @@
//go:build illumos
// Illumos system calls not present on Solaris.
package syscall
import "unsafe"
// F_DUP2FD_CLOEXEC has different values on Solaris and Illumos.
const F_DUP2FD_CLOEXEC = 0x24
//go:cgo_import_dynamic libc_flock flock "libc.so"
//go:linkname procFlock libc_flock

View file

@ -14,13 +14,13 @@ package syscall
import "unsafe"
const _F_DUP2FD_CLOEXEC = F_DUP2FD_CLOEXEC
func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno)
func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno)
func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno)
func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno)
const _F_DUP2FD_CLOEXEC = F_DUP2FD_CLOEXEC
// Implemented in asm_solaris_amd64.s.
func rawSysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno)
func sysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno)

View file

@ -0,0 +1,10 @@
// Copyright 2022 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//go:build solaris && !illumos
package syscall
// F_DUP2FD_CLOEXEC has different values on Solaris and Illumos.
const F_DUP2FD_CLOEXEC = 0x30

View file

@ -276,7 +276,6 @@ const (
F_CHKFL = 0x8
F_COMPAT = 0x8
F_DUP2FD = 0x9
F_DUP2FD_CLOEXEC = 0x24
F_DUPFD = 0x0
F_DUPFD_CLOEXEC = 0x25
F_FREESP = 0xb