]> Cypherpunks repositories - gostls13.git/commitdiff
syscall: reroute SYS_IOCTL and SYS_SYSCTL on openbsd
authorJoel Sing <joel@sing.id.au>
Sun, 12 Nov 2023 11:56:49 +0000 (22:56 +1100)
committerJoel Sing <joel@sing.id.au>
Sat, 4 May 2024 07:50:55 +0000 (07:50 +0000)
OpenBSD 7.5 no longer supports indirect syscalls. A number of Go
packages make use of syscall.Syscall with SYS_IOCTL or SYS_SYSCTL,
since neither is well supported by golang.org/x/sys/unix. Reroute
calls with either of these system call numbers to the respective
libc stub so that they continue to work.

Updates #63900

Change-Id: I3323a3fa311ee9227e6220417834253763866881
Reviewed-on: https://go-review.googlesource.com/c/go/+/582256
Reviewed-by: Ian Lance Taylor <iant@google.com>
Reviewed-by: David Chase <drchase@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>

src/syscall/syscall_openbsd_libc.go

index ddf62f4d3f4fd9aba89c8fdb4231b2a922c47a5e..81047eef3e68de70ff64b6292014272e7f97d66d 100644 (file)
@@ -19,10 +19,26 @@ func init() {
 //sys directSyscall(trap uintptr, a1 uintptr, a2 uintptr, a3 uintptr, a4 uintptr, a5 uintptr) (ret uintptr, err error) = SYS_syscall
 
 func syscallInternal(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) {
+       // OpenBSD 7.5+ no longer supports indirect syscalls. A number of Go
+       // packages make use of syscall.Syscall with SYS_IOCTL since it is
+       // not well supported by golang.org/x/sys/unix. Reroute this system
+       // call number to the respective libc stub so that it continues to
+       // work for the time being. See #63900 for further details.
+       if trap == SYS_IOCTL {
+               return syscallX(abi.FuncPCABI0(libc_ioctl_trampoline), a1, a2, a3)
+       }
        return syscall6X(abi.FuncPCABI0(libc_syscall_trampoline), trap, a1, a2, a3, 0, 0)
 }
 
 func syscall6Internal(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) {
+       // OpenBSD 7.5+ no longer supports indirect syscalls. A number of Go
+       // packages make use of syscall.Syscall with SYS___SYSCTL since it is
+       // not well supported by golang.org/x/sys/unix. Reroute this system
+       // call number to the respective libc stub so that it continues to
+       // work for the time being. See #63900 for further details.
+       if trap == SYS___SYSCTL {
+               return syscall6X(abi.FuncPCABI0(libc_sysctl_trampoline), a1, a2, a3, a4, a5, a6)
+       }
        return syscall10X(abi.FuncPCABI0(libc_syscall_trampoline), trap, a1, a2, a3, a4, a5, a6, 0, 0, 0)
 }