Skip to content

Commit d83791d

Browse files
internal/socket: always go through syscall package
Instead of relying on syscall.Syscall, always reach into the syscall package to call the appropriate functions on Unix systems. We were already doing this on Darwin and AIX. We also have to do this on OpenBSD, and it's simpler to do it on Linux 386 and s390x. Rather than sometimes reach into syscall and sometimes not, just always reach in. For golang/go#42064 Change-Id: I0adb1c7cc623f2c1247465b3852fefd8d09975d2 Reviewed-on: https://go-review.googlesource.com/c/net/+/366195 Trust: Ian Lance Taylor <[email protected]> Run-TryBot: Ian Lance Taylor <[email protected]> TryBot-Result: Go Bot <[email protected]> Reviewed-by: Bryan C. Mills <[email protected]>
1 parent fe8b969 commit d83791d

File tree

7 files changed

+25
-179
lines changed

7 files changed

+25
-179
lines changed

internal/socket/sys_bsd.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
// Use of this source code is governed by a BSD-style
33
// license that can be found in the LICENSE file.
44

5-
//go:build aix || darwin || dragonfly || freebsd || openbsd
6-
// +build aix darwin dragonfly freebsd openbsd
5+
//go:build aix || darwin || dragonfly || freebsd || openbsd || solaris
6+
// +build aix darwin dragonfly freebsd openbsd solaris
77

88
package socket
99

internal/socket/sys_linkname.go

-43
This file was deleted.

internal/socket/sys_linux_386.go

+2-27
Original file line numberDiff line numberDiff line change
@@ -10,38 +10,13 @@ import (
1010
)
1111

1212
const (
13-
sysSETSOCKOPT = 0xe
14-
sysGETSOCKOPT = 0xf
15-
sysSENDMSG = 0x10
16-
sysRECVMSG = 0x11
17-
sysRECVMMSG = 0x13
18-
sysSENDMMSG = 0x14
13+
sysRECVMMSG = 0x13
14+
sysSENDMMSG = 0x14
1915
)
2016

2117
func socketcall(call, a0, a1, a2, a3, a4, a5 uintptr) (uintptr, syscall.Errno)
2218
func rawsocketcall(call, a0, a1, a2, a3, a4, a5 uintptr) (uintptr, syscall.Errno)
2319

24-
func getsockopt(s uintptr, level, name int, b []byte) (int, error) {
25-
l := uint32(len(b))
26-
_, errno := socketcall(sysGETSOCKOPT, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(unsafe.Pointer(&l)), 0)
27-
return int(l), errnoErr(errno)
28-
}
29-
30-
func setsockopt(s uintptr, level, name int, b []byte) error {
31-
_, errno := socketcall(sysSETSOCKOPT, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(len(b)), 0)
32-
return errnoErr(errno)
33-
}
34-
35-
func recvmsg(s uintptr, h *msghdr, flags int) (int, error) {
36-
n, errno := socketcall(sysRECVMSG, s, uintptr(unsafe.Pointer(h)), uintptr(flags), 0, 0, 0)
37-
return int(n), errnoErr(errno)
38-
}
39-
40-
func sendmsg(s uintptr, h *msghdr, flags int) (int, error) {
41-
n, errno := socketcall(sysSENDMSG, s, uintptr(unsafe.Pointer(h)), uintptr(flags), 0, 0, 0)
42-
return int(n), errnoErr(errno)
43-
}
44-
4520
func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) {
4621
n, errno := socketcall(sysRECVMMSG, s, uintptr(unsafe.Pointer(&hs[0])), uintptr(len(hs)), uintptr(flags), 0, 0)
4722
return int(n), errnoErr(errno)

internal/socket/sys_linux_s390x.go

+2-27
Original file line numberDiff line numberDiff line change
@@ -10,38 +10,13 @@ import (
1010
)
1111

1212
const (
13-
sysSETSOCKOPT = 0xe
14-
sysGETSOCKOPT = 0xf
15-
sysSENDMSG = 0x10
16-
sysRECVMSG = 0x11
17-
sysRECVMMSG = 0x13
18-
sysSENDMMSG = 0x14
13+
sysRECVMMSG = 0x13
14+
sysSENDMMSG = 0x14
1915
)
2016

2117
func socketcall(call, a0, a1, a2, a3, a4, a5 uintptr) (uintptr, syscall.Errno)
2218
func rawsocketcall(call, a0, a1, a2, a3, a4, a5 uintptr) (uintptr, syscall.Errno)
2319

24-
func getsockopt(s uintptr, level, name int, b []byte) (int, error) {
25-
l := uint32(len(b))
26-
_, errno := socketcall(sysGETSOCKOPT, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(unsafe.Pointer(&l)), 0)
27-
return int(l), errnoErr(errno)
28-
}
29-
30-
func setsockopt(s uintptr, level, name int, b []byte) error {
31-
_, errno := socketcall(sysSETSOCKOPT, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(len(b)), 0)
32-
return errnoErr(errno)
33-
}
34-
35-
func recvmsg(s uintptr, h *msghdr, flags int) (int, error) {
36-
n, errno := socketcall(sysRECVMSG, s, uintptr(unsafe.Pointer(h)), uintptr(flags), 0, 0, 0)
37-
return int(n), errnoErr(errno)
38-
}
39-
40-
func sendmsg(s uintptr, h *msghdr, flags int) (int, error) {
41-
n, errno := socketcall(sysSENDMSG, s, uintptr(unsafe.Pointer(h)), uintptr(flags), 0, 0, 0)
42-
return int(n), errnoErr(errno)
43-
}
44-
4520
func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) {
4621
n, errno := socketcall(sysRECVMMSG, s, uintptr(unsafe.Pointer(&hs[0])), uintptr(len(hs)), uintptr(flags), 0, 0)
4722
return int(n), errnoErr(errno)

internal/socket/sys_solaris.go

-59
This file was deleted.

internal/socket/sys_solaris_amd64.s

-11
This file was deleted.

internal/socket/sys_unix.go

+19-10
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
// Use of this source code is governed by a BSD-style
33
// license that can be found in the LICENSE file.
44

5-
//go:build dragonfly || freebsd || (linux && !s390x && !386) || netbsd || openbsd
6-
// +build dragonfly freebsd linux,!s390x,!386 netbsd openbsd
5+
//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris
6+
// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris
77

88
package socket
99

@@ -12,23 +12,32 @@ import (
1212
"unsafe"
1313
)
1414

15+
//go:linkname syscall_getsockopt syscall.getsockopt
16+
func syscall_getsockopt(s, level, name int, val unsafe.Pointer, vallen *uint32) error
17+
18+
//go:linkname syscall_setsockopt syscall.setsockopt
19+
func syscall_setsockopt(s, level, name int, val unsafe.Pointer, vallen uintptr) error
20+
21+
//go:linkname syscall_recvmsg syscall.recvmsg
22+
func syscall_recvmsg(s int, msg *syscall.Msghdr, flags int) (int, error)
23+
24+
//go:linkname syscall_sendmsg syscall.sendmsg
25+
func syscall_sendmsg(s int, msg *syscall.Msghdr, flags int) (int, error)
26+
1527
func getsockopt(s uintptr, level, name int, b []byte) (int, error) {
1628
l := uint32(len(b))
17-
_, _, errno := syscall.Syscall6(syscall.SYS_GETSOCKOPT, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(unsafe.Pointer(&l)), 0)
18-
return int(l), errnoErr(errno)
29+
err := syscall_getsockopt(int(s), level, name, unsafe.Pointer(&b[0]), &l)
30+
return int(l), err
1931
}
2032

2133
func setsockopt(s uintptr, level, name int, b []byte) error {
22-
_, _, errno := syscall.Syscall6(syscall.SYS_SETSOCKOPT, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(len(b)), 0)
23-
return errnoErr(errno)
34+
return syscall_setsockopt(int(s), level, name, unsafe.Pointer(&b[0]), uintptr(len(b)))
2435
}
2536

2637
func recvmsg(s uintptr, h *msghdr, flags int) (int, error) {
27-
n, _, errno := syscall.Syscall(syscall.SYS_RECVMSG, s, uintptr(unsafe.Pointer(h)), uintptr(flags))
28-
return int(n), errnoErr(errno)
38+
return syscall_recvmsg(int(s), (*syscall.Msghdr)(unsafe.Pointer(h)), flags)
2939
}
3040

3141
func sendmsg(s uintptr, h *msghdr, flags int) (int, error) {
32-
n, _, errno := syscall.Syscall(syscall.SYS_SENDMSG, s, uintptr(unsafe.Pointer(h)), uintptr(flags))
33-
return int(n), errnoErr(errno)
42+
return syscall_sendmsg(int(s), (*syscall.Msghdr)(unsafe.Pointer(h)), flags)
3443
}

0 commit comments

Comments
 (0)