diff options
| author | Brad Fitzpatrick <bradfitz@golang.org> | 2026-03-24 23:02:09 +0000 |
|---|---|---|
| committer | Brad Fitzpatrick <bradfitz@golang.org> | 2026-03-25 10:11:26 -0700 |
| commit | 04dc12c1a17d3fa4ff49af84de5641099716e234 (patch) | |
| tree | 4b11d9f4e70b9e284d618bc3ccee16e772d0921a /src/internal/runtime/syscall | |
| parent | fa238516b782bd1f233e85b719b7ab90889a5634 (diff) | |
| download | go-04dc12c1a17d3fa4ff49af84de5641099716e234.tar.xz | |
runtime: use uname version check for 64-bit time on 32-bit arch codepaths
The previous fallback-on-ENOSYS logic causes issues on forks of Linux.
Android: #77621 (CL 750040 added a workaround with a TODO,
this fixes that TODO)
Causes the OS to terminate the program when running on Android
versions <=10 since the seccomp jail does not know about the 64-bit
time syscall and is configured to terminate the program on any
unknown syscall.
Synology's Linux: #77930
On old versions of Synology's Linux they added custom vendor syscalls
without adding a gap in the syscall numbers, that means when we call
the newer Linux syscall which was added later, Synology's Linux
interprets it as a completely different vendor syscall.
Originally by Jorropo in CL 751340.
Fixes #77930
Co-authored-by: Jorropo <jorropo.pgm@gmail.com>
Change-Id: I90e15495d9249fd7f6e112f9e3ae8ad1322f56e0
Reviewed-on: https://go-review.googlesource.com/c/go/+/758902
Reviewed-by: Damien Neil <dneil@google.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
Reviewed-by: Jorropo <jorropo.pgm@gmail.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Diffstat (limited to 'src/internal/runtime/syscall')
11 files changed, 24 insertions, 0 deletions
diff --git a/src/internal/runtime/syscall/linux/defs_linux_386.go b/src/internal/runtime/syscall/linux/defs_linux_386.go index 7fdf5d3f80..4e8e645dc4 100644 --- a/src/internal/runtime/syscall/linux/defs_linux_386.go +++ b/src/internal/runtime/syscall/linux/defs_linux_386.go @@ -17,6 +17,7 @@ const ( SYS_OPENAT = 295 SYS_PREAD64 = 180 SYS_READ = 3 + SYS_UNAME = 122 EFD_NONBLOCK = 0x800 diff --git a/src/internal/runtime/syscall/linux/defs_linux_amd64.go b/src/internal/runtime/syscall/linux/defs_linux_amd64.go index 2c8676e6e9..fa764d9ccd 100644 --- a/src/internal/runtime/syscall/linux/defs_linux_amd64.go +++ b/src/internal/runtime/syscall/linux/defs_linux_amd64.go @@ -17,6 +17,7 @@ const ( SYS_OPENAT = 257 SYS_PREAD64 = 17 SYS_READ = 0 + SYS_UNAME = 63 EFD_NONBLOCK = 0x800 diff --git a/src/internal/runtime/syscall/linux/defs_linux_arm.go b/src/internal/runtime/syscall/linux/defs_linux_arm.go index a0b395d676..cef556d5f6 100644 --- a/src/internal/runtime/syscall/linux/defs_linux_arm.go +++ b/src/internal/runtime/syscall/linux/defs_linux_arm.go @@ -17,6 +17,7 @@ const ( SYS_OPENAT = 322 SYS_PREAD64 = 180 SYS_READ = 3 + SYS_UNAME = 122 EFD_NONBLOCK = 0x800 diff --git a/src/internal/runtime/syscall/linux/defs_linux_arm64.go b/src/internal/runtime/syscall/linux/defs_linux_arm64.go index 223dce0c5b..eabddbac1b 100644 --- a/src/internal/runtime/syscall/linux/defs_linux_arm64.go +++ b/src/internal/runtime/syscall/linux/defs_linux_arm64.go @@ -17,6 +17,7 @@ const ( SYS_OPENAT = 56 SYS_PREAD64 = 67 SYS_READ = 63 + SYS_UNAME = 160 EFD_NONBLOCK = 0x800 diff --git a/src/internal/runtime/syscall/linux/defs_linux_loong64.go b/src/internal/runtime/syscall/linux/defs_linux_loong64.go index 8aa61c391d..08e5d49b83 100644 --- a/src/internal/runtime/syscall/linux/defs_linux_loong64.go +++ b/src/internal/runtime/syscall/linux/defs_linux_loong64.go @@ -17,6 +17,7 @@ const ( SYS_OPENAT = 56 SYS_PREAD64 = 67 SYS_READ = 63 + SYS_UNAME = 160 EFD_NONBLOCK = 0x800 diff --git a/src/internal/runtime/syscall/linux/defs_linux_mips64x.go b/src/internal/runtime/syscall/linux/defs_linux_mips64x.go index 84b760dc1b..b5794e5002 100644 --- a/src/internal/runtime/syscall/linux/defs_linux_mips64x.go +++ b/src/internal/runtime/syscall/linux/defs_linux_mips64x.go @@ -19,6 +19,7 @@ const ( SYS_OPENAT = 5247 SYS_PREAD64 = 5016 SYS_READ = 5000 + SYS_UNAME = 5061 EFD_NONBLOCK = 0x80 diff --git a/src/internal/runtime/syscall/linux/defs_linux_mipsx.go b/src/internal/runtime/syscall/linux/defs_linux_mipsx.go index a9be21414c..1fb4d919d1 100644 --- a/src/internal/runtime/syscall/linux/defs_linux_mipsx.go +++ b/src/internal/runtime/syscall/linux/defs_linux_mipsx.go @@ -19,6 +19,7 @@ const ( SYS_OPENAT = 4288 SYS_PREAD64 = 4200 SYS_READ = 4003 + SYS_UNAME = 4122 EFD_NONBLOCK = 0x80 diff --git a/src/internal/runtime/syscall/linux/defs_linux_ppc64x.go b/src/internal/runtime/syscall/linux/defs_linux_ppc64x.go index 63f4e5d786..ee93ad345b 100644 --- a/src/internal/runtime/syscall/linux/defs_linux_ppc64x.go +++ b/src/internal/runtime/syscall/linux/defs_linux_ppc64x.go @@ -19,6 +19,7 @@ const ( SYS_OPENAT = 286 SYS_PREAD64 = 179 SYS_READ = 3 + SYS_UNAME = 122 EFD_NONBLOCK = 0x800 diff --git a/src/internal/runtime/syscall/linux/defs_linux_riscv64.go b/src/internal/runtime/syscall/linux/defs_linux_riscv64.go index 8aa61c391d..08e5d49b83 100644 --- a/src/internal/runtime/syscall/linux/defs_linux_riscv64.go +++ b/src/internal/runtime/syscall/linux/defs_linux_riscv64.go @@ -17,6 +17,7 @@ const ( SYS_OPENAT = 56 SYS_PREAD64 = 67 SYS_READ = 63 + SYS_UNAME = 160 EFD_NONBLOCK = 0x800 diff --git a/src/internal/runtime/syscall/linux/defs_linux_s390x.go b/src/internal/runtime/syscall/linux/defs_linux_s390x.go index 52945db0e5..da11c70408 100644 --- a/src/internal/runtime/syscall/linux/defs_linux_s390x.go +++ b/src/internal/runtime/syscall/linux/defs_linux_s390x.go @@ -17,6 +17,7 @@ const ( SYS_OPENAT = 288 SYS_PREAD64 = 180 SYS_READ = 3 + SYS_UNAME = 122 EFD_NONBLOCK = 0x800 diff --git a/src/internal/runtime/syscall/linux/syscall_linux.go b/src/internal/runtime/syscall/linux/syscall_linux.go index 8201e7d190..b64f511b03 100644 --- a/src/internal/runtime/syscall/linux/syscall_linux.go +++ b/src/internal/runtime/syscall/linux/syscall_linux.go @@ -86,3 +86,17 @@ func Pread(fd int, p []byte, offset int64) (n int, errno uintptr) { } return int(r1), e } + +type Utsname struct { + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte +} + +func Uname(buf *Utsname) (errno uintptr) { + _, _, e := Syscall6(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0, 0, 0, 0) + return e +} |
