From 36951a9f638b03950b7413eee73bd0e3ccf47130 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Mon, 18 Dec 2017 11:59:26 +0100 Subject: [PATCH] syscall: support syscalls without error return on Linux Add the rawSyscallNoError wrapper function which is used for Linux syscalls that don't return an error and convert all applicable occurences of RawSyscall to use it instead. Fixes #22924 Change-Id: Iff1eddb54573d459faa01471f10398b3d38528dd Reviewed-on: https://go-review.googlesource.com/84485 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/syscall/asm_linux_386.s | 36 +++++++---- src/syscall/asm_linux_amd64.s | 18 +++++- src/syscall/asm_linux_arm.s | 62 +++++++++++-------- src/syscall/asm_linux_arm64.s | 17 +++++- src/syscall/asm_linux_mips64x.s | 16 ++++- src/syscall/asm_linux_mipsx.s | 14 ++++- src/syscall/asm_linux_ppc64x.s | 16 ++++- src/syscall/asm_linux_s390x.s | 14 +++++ src/syscall/exec_linux.go | 11 ++-- src/syscall/export_linux_test.go | 9 +++ src/syscall/mksyscall.pl | 13 +++- src/syscall/setuidgid_32_linux.go | 2 + src/syscall/setuidgid_linux.go | 2 + src/syscall/syscall_linux.go | 2 + src/syscall/syscall_linux_test.go | 86 +++++++++++++++++++++++++++ src/syscall/zsyscall_linux_386.go | 16 ++--- src/syscall/zsyscall_linux_amd64.go | 16 ++--- src/syscall/zsyscall_linux_arm.go | 16 ++--- src/syscall/zsyscall_linux_arm64.go | 16 ++--- src/syscall/zsyscall_linux_ppc64.go | 16 ++--- src/syscall/zsyscall_linux_ppc64le.go | 16 ++--- src/syscall/zsyscall_linux_s390x.go | 16 ++--- 22 files changed, 316 insertions(+), 114 deletions(-) create mode 100644 src/syscall/export_linux_test.go diff --git a/src/syscall/asm_linux_386.s b/src/syscall/asm_linux_386.s index 228a542cf1..4201f367ba 100644 --- a/src/syscall/asm_linux_386.s +++ b/src/syscall/asm_linux_386.s @@ -9,21 +9,20 @@ // System calls for 386, Linux // -// func Syscall(trap uintptr, a1, a2, a3 uintptr) (r1, r2, err uintptr); -// Trap # in AX, args in BX CX DX SI DI, return in AX - // See ../runtime/sys_linux_386.s for the reason why we always use int 0x80 // instead of the glibc-specific "CALL 0x10(GS)". #define INVOKE_SYSCALL INT $0x80 -TEXT ·Syscall(SB),NOSPLIT,$0-28 +// func Syscall(trap uintptr, a1, a2, a3 uintptr) (r1, r2, err uintptr); +// Trap # in AX, args in BX CX DX SI DI, return in AX +TEXT ·Syscall(SB),NOSPLIT,$0-28 CALL runtime·entersyscall(SB) MOVL trap+0(FP), AX // syscall entry MOVL a1+4(FP), BX MOVL a2+8(FP), CX MOVL a3+12(FP), DX MOVL $0, SI - MOVL $0, DI + MOVL $0, DI INVOKE_SYSCALL CMPL AX, $0xfffff001 JLS ok @@ -41,7 +40,7 @@ ok: RET // func Syscall6(trap uintptr, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr); -TEXT ·Syscall6(SB),NOSPLIT,$0-40 +TEXT ·Syscall6(SB),NOSPLIT,$0-40 CALL runtime·entersyscall(SB) MOVL trap+0(FP), AX // syscall entry MOVL a1+4(FP), BX @@ -73,7 +72,7 @@ TEXT ·RawSyscall(SB),NOSPLIT,$0-28 MOVL a2+8(FP), CX MOVL a3+12(FP), DX MOVL $0, SI - MOVL $0, DI + MOVL $0, DI INVOKE_SYSCALL CMPL AX, $0xfffff001 JLS ok1 @@ -89,7 +88,7 @@ ok1: RET // func RawSyscall6(trap uintptr, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr); -TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 MOVL trap+0(FP), AX // syscall entry MOVL a1+4(FP), BX MOVL a2+8(FP), CX @@ -111,6 +110,19 @@ ok2: MOVL $0, err+36(FP) RET +// func rawSyscallNoError(trap uintptr, a1, a2, a3 uintptr) (r1, r2 uintptr); +TEXT ·rawSyscallNoError(SB),NOSPLIT,$0-24 + MOVL trap+0(FP), AX // syscall entry + MOVL a1+4(FP), BX + MOVL a2+8(FP), CX + MOVL a3+12(FP), DX + MOVL $0, SI + MOVL $0, DI + INVOKE_SYSCALL + MOVL AX, r1+16(FP) + MOVL DX, r2+20(FP) + RET + #define SYS_SOCKETCALL 102 /* from zsysnum_linux_386.go */ // func socketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (n int, err int) @@ -119,10 +131,10 @@ TEXT ·socketcall(SB),NOSPLIT,$0-36 CALL runtime·entersyscall(SB) MOVL $SYS_SOCKETCALL, AX // syscall entry MOVL call+0(FP), BX // socket call number - LEAL a0+4(FP), CX // pointer to call arguments + LEAL a0+4(FP), CX // pointer to call arguments MOVL $0, DX MOVL $0, SI - MOVL $0, DI + MOVL $0, DI INVOKE_SYSCALL CMPL AX, $0xfffff001 JLS oksock @@ -145,7 +157,7 @@ TEXT ·rawsocketcall(SB),NOSPLIT,$0-36 LEAL a0+4(FP), CX // pointer to call arguments MOVL $0, DX MOVL $0, SI - MOVL $0, DI + MOVL $0, DI INVOKE_SYSCALL CMPL AX, $0xfffff001 JLS oksock1 @@ -171,7 +183,7 @@ TEXT ·seek(SB),NOSPLIT,$0-28 MOVL offset_hi+8(FP), CX MOVL offset_lo+4(FP), DX LEAL newoffset_lo+16(FP), SI // result pointer - MOVL whence+12(FP), DI + MOVL whence+12(FP), DI INVOKE_SYSCALL CMPL AX, $0xfffff001 JLS okseek diff --git a/src/syscall/asm_linux_amd64.s b/src/syscall/asm_linux_amd64.s index b7cd5416fe..7e05925d7f 100644 --- a/src/syscall/asm_linux_amd64.s +++ b/src/syscall/asm_linux_amd64.s @@ -9,12 +9,12 @@ // System calls for AMD64, Linux // -// func Syscall(trap int64, a1, a2, a3 int64) (r1, r2, err int64); +// func Syscall(trap int64, a1, a2, a3 uintptr) (r1, r2, err uintptr); // Trap # in AX, args in DI SI DX R10 R8 R9, return in AX DX // Note that this differs from "standard" ABI convention, which // would pass 4th arg in CX, not R10. -TEXT ·Syscall(SB),NOSPLIT,$0-56 +TEXT ·Syscall(SB),NOSPLIT,$0-56 CALL runtime·entersyscall(SB) MOVQ a1+8(FP), DI MOVQ a2+16(FP), SI @@ -134,6 +134,20 @@ ok2: MOVQ $0, err+24(FP) RET +// func rawSyscallNoError(trap, a1, a2, a3 uintptr) (r1, r2 uintptr) +TEXT ·rawSyscallNoError(SB),NOSPLIT,$0-48 + MOVQ a1+8(FP), DI + MOVQ a2+16(FP), SI + MOVQ a3+24(FP), DX + MOVQ $0, R10 + MOVQ $0, R8 + MOVQ $0, R9 + MOVQ trap+0(FP), AX // syscall entry + SYSCALL + MOVQ AX, r1+32(FP) + MOVQ DX, r2+40(FP) + RET + // func gettimeofday(tv *Timeval) (err uintptr) TEXT ·gettimeofday(SB),NOSPLIT,$0-16 MOVQ tv+0(FP), DI diff --git a/src/syscall/asm_linux_arm.s b/src/syscall/asm_linux_arm.s index 997ba6f1c1..4463a0f3e7 100644 --- a/src/syscall/asm_linux_arm.s +++ b/src/syscall/asm_linux_arm.s @@ -12,9 +12,8 @@ // TODO(kaib): handle error returns // func Syscall(syscall uintptr, a1, a2, a3 uintptr) (r1, r2, err uintptr); - -TEXT ·Syscall(SB),NOSPLIT,$0-28 - BL runtime·entersyscall(SB) +TEXT ·Syscall(SB),NOSPLIT,$0-28 + BL runtime·entersyscall(SB) MOVW trap+0(FP), R7 MOVW a1+4(FP), R0 MOVW a2+8(FP), R1 @@ -22,30 +21,30 @@ TEXT ·Syscall(SB),NOSPLIT,$0-28 MOVW $0, R3 MOVW $0, R4 MOVW $0, R5 - SWI $0 + SWI $0 MOVW $0xfffff001, R1 - CMP R1, R0 - BLS ok + CMP R1, R0 + BLS ok MOVW $-1, R1 MOVW R1, r1+16(FP) MOVW $0, R2 MOVW R2, r2+20(FP) - RSB $0, R0, R0 + RSB $0, R0, R0 MOVW R0, err+24(FP) - BL runtime·exitsyscall(SB) + BL runtime·exitsyscall(SB) RET ok: MOVW R0, r1+16(FP) MOVW $0, R0 MOVW R0, r2+20(FP) MOVW R0, err+24(FP) - BL runtime·exitsyscall(SB) + BL runtime·exitsyscall(SB) RET // func Syscall6(trap uintptr, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr); // Actually Syscall5 but the rest of the code expects it to be named Syscall6. -TEXT ·Syscall6(SB),NOSPLIT,$0-40 - BL runtime·entersyscall(SB) +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + BL runtime·entersyscall(SB) MOVW trap+0(FP), R7 // syscall entry MOVW a1+4(FP), R0 MOVW a2+8(FP), R1 @@ -53,24 +52,24 @@ TEXT ·Syscall6(SB),NOSPLIT,$0-40 MOVW a4+16(FP), R3 MOVW a5+20(FP), R4 MOVW a6+24(FP), R5 - SWI $0 + SWI $0 MOVW $0xfffff001, R6 - CMP R6, R0 - BLS ok6 + CMP R6, R0 + BLS ok6 MOVW $-1, R1 MOVW R1, r1+28(FP) MOVW $0, R2 MOVW R2, r2+32(FP) - RSB $0, R0, R0 + RSB $0, R0, R0 MOVW R0, err+36(FP) - BL runtime·exitsyscall(SB) + BL runtime·exitsyscall(SB) RET ok6: MOVW R0, r1+28(FP) MOVW R1, r2+32(FP) MOVW $0, R0 MOVW R0, err+36(FP) - BL runtime·exitsyscall(SB) + BL runtime·exitsyscall(SB) RET // func RawSyscall6(trap uintptr, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr); @@ -83,15 +82,15 @@ TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 MOVW a4+16(FP), R3 MOVW a5+20(FP), R4 MOVW a6+24(FP), R5 - SWI $0 + SWI $0 MOVW $0xfffff001, R6 - CMP R6, R0 - BLS ok2 + CMP R6, R0 + BLS ok2 MOVW $-1, R1 MOVW R1, r1+28(FP) MOVW $0, R2 MOVW R2, r2+32(FP) - RSB $0, R0, R0 + RSB $0, R0, R0 MOVW R0, err+36(FP) RET ok2: @@ -131,7 +130,7 @@ okseek: MOVW $0, R0 MOVW R0, err+24(FP) BL runtime·exitsyscall(SB) - RET + RET // func RawSyscall(trap uintptr, a1, a2, a3 uintptr) (r1, r2, err uintptr); TEXT ·RawSyscall(SB),NOSPLIT,$0-28 @@ -139,15 +138,15 @@ TEXT ·RawSyscall(SB),NOSPLIT,$0-28 MOVW a1+4(FP), R0 MOVW a2+8(FP), R1 MOVW a3+12(FP), R2 - SWI $0 + SWI $0 MOVW $0xfffff001, R1 - CMP R1, R0 - BLS ok1 + CMP R1, R0 + BLS ok1 MOVW $-1, R1 MOVW R1, r1+16(FP) MOVW $0, R2 MOVW R2, r2+20(FP) - RSB $0, R0, R0 + RSB $0, R0, R0 MOVW R0, err+24(FP) RET ok1: @@ -157,3 +156,14 @@ ok1: MOVW R0, err+24(FP) RET +// func rawSyscallNoError(trap uintptr, a1, a2, a3 uintptr) (r1, r2 uintptr); +TEXT ·rawSyscallNoError(SB),NOSPLIT,$0-24 + MOVW trap+0(FP), R7 // syscall entry + MOVW a1+4(FP), R0 + MOVW a2+8(FP), R1 + MOVW a3+12(FP), R2 + SWI $0 + MOVW R0, r1+16(FP) + MOVW $0, R0 + MOVW R0, r2+20(FP) + RET diff --git a/src/syscall/asm_linux_arm64.s b/src/syscall/asm_linux_arm64.s index 184a44fd2f..7edeafca81 100644 --- a/src/syscall/asm_linux_arm64.s +++ b/src/syscall/asm_linux_arm64.s @@ -5,8 +5,7 @@ #include "textflag.h" // func Syscall(trap int64, a1, a2, a3 int64) (r1, r2, err int64); - -TEXT ·Syscall(SB),NOSPLIT,$0-56 +TEXT ·Syscall(SB),NOSPLIT,$0-56 BL runtime·entersyscall(SB) MOVD a1+8(FP), R0 MOVD a2+16(FP), R1 @@ -103,3 +102,17 @@ ok: MOVD R1, r2+64(FP) // r2 MOVD ZR, err+72(FP) // errno RET + +// func rawSyscallNoError(trap uintptr, a1, a2, a3 uintptr) (r1, r2 uintptr); +TEXT ·rawSyscallNoError(SB),NOSPLIT,$0-48 + MOVD a1+8(FP), R0 + MOVD a2+16(FP), R1 + MOVD a3+24(FP), R2 + MOVD $0, R3 + MOVD $0, R4 + MOVD $0, R5 + MOVD trap+0(FP), R8 // syscall entry + SVC + MOVD R0, r1+32(FP) + MOVD R1, r2+40(FP) + RET diff --git a/src/syscall/asm_linux_mips64x.s b/src/syscall/asm_linux_mips64x.s index 81717d2588..d0b0e5a0a8 100644 --- a/src/syscall/asm_linux_mips64x.s +++ b/src/syscall/asm_linux_mips64x.s @@ -12,8 +12,7 @@ // // func Syscall(trap int64, a1, a2, a3 int64) (r1, r2, err int64); - -TEXT ·Syscall(SB),NOSPLIT,$0-56 +TEXT ·Syscall(SB),NOSPLIT,$0-56 JAL runtime·entersyscall(SB) MOVV a1+8(FP), R4 MOVV a2+16(FP), R5 @@ -102,3 +101,16 @@ ok2: MOVV R3, r2+64(FP) // r2 MOVV R0, err+72(FP) // errno RET + +TEXT ·rawSyscallNoError(SB),NOSPLIT,$0-48 + MOVV a1+8(FP), R4 + MOVV a2+16(FP), R5 + MOVV a3+24(FP), R6 + MOVV R0, R7 + MOVV R0, R8 + MOVV R0, R9 + MOVV trap+0(FP), R2 // syscall entry + SYSCALL + MOVV R2, r1+32(FP) + MOVV R3, r2+40(FP) + RET diff --git a/src/syscall/asm_linux_mipsx.s b/src/syscall/asm_linux_mipsx.s index 40ab82b834..5727e4d41d 100644 --- a/src/syscall/asm_linux_mipsx.s +++ b/src/syscall/asm_linux_mipsx.s @@ -13,8 +13,7 @@ // // func Syscall(trap uintptr, a1, a2, a3 uintptr) (r1, r2, err uintptr); - -TEXT ·Syscall(SB),NOSPLIT,$0-28 +TEXT ·Syscall(SB),NOSPLIT,$0-28 JAL runtime·entersyscall(SB) MOVW a1+4(FP), R4 MOVW a2+8(FP), R5 @@ -36,7 +35,6 @@ ok: JAL runtime·exitsyscall(SB) RET - // func Syscall6(trap trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr); // 5th and 6th arg go at sp+16, sp+20. // Note that frame size of 20 means that 24 bytes gets reserved on stack. @@ -140,3 +138,13 @@ ok2: MOVW R3, r2+32(FP) // r2 MOVW R0, err+36(FP) // errno RET + +TEXT ·rawSyscallNoError(SB),NOSPLIT,$20-24 + MOVW a1+4(FP), R4 + MOVW a2+8(FP), R5 + MOVW a3+12(FP), R6 + MOVW trap+0(FP), R2 // syscall entry + SYSCALL + MOVW R2, r1+16(FP) // r1 + MOVW R3, r2+20(FP) // r2 + RET diff --git a/src/syscall/asm_linux_ppc64x.s b/src/syscall/asm_linux_ppc64x.s index be6727cb1a..424efbbdc9 100644 --- a/src/syscall/asm_linux_ppc64x.s +++ b/src/syscall/asm_linux_ppc64x.s @@ -12,8 +12,7 @@ // // func Syscall(trap int64, a1, a2, a3 int64) (r1, r2, err int64); - -TEXT ·Syscall(SB),NOSPLIT,$0-56 +TEXT ·Syscall(SB),NOSPLIT,$0-56 BL runtime·entersyscall(SB) MOVD a1+8(FP), R3 MOVD a2+16(FP), R4 @@ -102,3 +101,16 @@ ok2: MOVD R4, r2+64(FP) // r2 MOVD R0, err+72(FP) // errno RET + +TEXT ·rawSyscallNoError(SB),NOSPLIT,$0-48 + MOVD a1+8(FP), R3 + MOVD a2+16(FP), R4 + MOVD a3+24(FP), R5 + MOVD R0, R6 + MOVD R0, R7 + MOVD R0, R8 + MOVD trap+0(FP), R9 // syscall entry + SYSCALL R9 + MOVD R3, r1+32(FP) + MOVD R4, r2+40(FP) + RET diff --git a/src/syscall/asm_linux_s390x.s b/src/syscall/asm_linux_s390x.s index e22a92b966..62125f2610 100644 --- a/src/syscall/asm_linux_s390x.s +++ b/src/syscall/asm_linux_s390x.s @@ -106,6 +106,20 @@ ok2: MOVD $0, err+72(FP) // errno RET +// func rawSyscallNoError(trap, a1, a2, a3 uintptr) (r1, r2 uintptr) +TEXT ·rawSyscallNoError(SB),NOSPLIT,$0-48 + MOVD a1+8(FP), R2 + MOVD a2+16(FP), R3 + MOVD a3+24(FP), R4 + MOVD $0, R5 + MOVD $0, R6 + MOVD $0, R7 + MOVD trap+0(FP), R1 // syscall entry + SYSCALL + MOVD R2, r1+32(FP) + MOVD R3, r2+40(FP) + RET + #define SYS_SOCKETCALL 102 /* from zsysnum_linux_s390x.go */ // func socketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (n int, err int) diff --git a/src/syscall/exec_linux.go b/src/syscall/exec_linux.go index bfbe2b3d59..7ae3177fdc 100644 --- a/src/syscall/exec_linux.go +++ b/src/syscall/exec_linux.go @@ -122,7 +122,7 @@ func forkAndExecInChild1(argv0 *byte, argv, envv []*byte, chroot, dir *byte, att ) // Record parent PID so child can test if it has died. - ppid, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + ppid, _ := rawSyscallNoError(SYS_GETPID, 0, 0, 0) // Guard against side effects of shuffling fds below. // Make sure that nextfd is beyond any currently open files so @@ -219,10 +219,7 @@ func forkAndExecInChild1(argv0 *byte, argv, envv []*byte, chroot, dir *byte, att if sys.Foreground { pgrp := int32(sys.Pgid) if pgrp == 0 { - r1, _, err1 = RawSyscall(SYS_GETPID, 0, 0, 0) - if err1 != 0 { - goto childerror - } + r1, _ = rawSyscallNoError(SYS_GETPID, 0, 0, 0) pgrp = int32(r1) } @@ -311,9 +308,9 @@ func forkAndExecInChild1(argv0 *byte, argv, envv []*byte, chroot, dir *byte, att // Signal self if parent is already dead. This might cause a // duplicate signal in rare cases, but it won't matter when // using SIGKILL. - r1, _, _ = RawSyscall(SYS_GETPPID, 0, 0, 0) + r1, _ = rawSyscallNoError(SYS_GETPPID, 0, 0, 0) if r1 != ppid { - pid, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid, _ := rawSyscallNoError(SYS_GETPID, 0, 0, 0) _, _, err1 := RawSyscall(SYS_KILL, pid, uintptr(sys.Pdeathsig), 0) if err1 != 0 { goto childerror diff --git a/src/syscall/export_linux_test.go b/src/syscall/export_linux_test.go new file mode 100644 index 0000000000..274849e2ea --- /dev/null +++ b/src/syscall/export_linux_test.go @@ -0,0 +1,9 @@ +// Copyright 2018 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. + +package syscall + +var RawSyscallNoError = rawSyscallNoError + +const Sys_GETEUID = sys_GETEUID diff --git a/src/syscall/mksyscall.pl b/src/syscall/mksyscall.pl index 699982e63c..894f828d59 100755 --- a/src/syscall/mksyscall.pl +++ b/src/syscall/mksyscall.pl @@ -205,7 +205,11 @@ while(<>) { # Determine which form to use; pad args with zeros. my $asm = "Syscall"; if ($nonblock) { - $asm = "RawSyscall"; + if ($errvar eq "" && $ENV{'GOOS'} eq "linux") { + $asm = "rawSyscallNoError"; + } else { + $asm = "RawSyscall"; + } } if(@args <= 3) { while(@args < 3) { @@ -282,7 +286,12 @@ while(<>) { if ($ret[0] eq "_" && $ret[1] eq "_" && $ret[2] eq "_") { $text .= "\t$call\n"; } else { - $text .= "\t$ret[0], $ret[1], $ret[2] := $call\n"; + if ($errvar eq "" && $ENV{'GOOS'} eq "linux") { + # raw syscall without error on Linux, see golang.org/issue/22924 + $text .= "\t$ret[0], $ret[1] := $call\n"; + } else { + $text .= "\t$ret[0], $ret[1], $ret[2] := $call\n"; + } } $text .= $body; diff --git a/src/syscall/setuidgid_32_linux.go b/src/syscall/setuidgid_32_linux.go index 182f5d26a9..1fe7120d1c 100644 --- a/src/syscall/setuidgid_32_linux.go +++ b/src/syscall/setuidgid_32_linux.go @@ -8,6 +8,8 @@ package syscall const ( + sys_GETEUID = SYS_GETEUID32 + sys_SETGID = SYS_SETGID32 sys_SETUID = SYS_SETUID32 ) diff --git a/src/syscall/setuidgid_linux.go b/src/syscall/setuidgid_linux.go index bf40d2d882..22fa334bfa 100644 --- a/src/syscall/setuidgid_linux.go +++ b/src/syscall/setuidgid_linux.go @@ -8,6 +8,8 @@ package syscall const ( + sys_GETEUID = SYS_GETEUID + sys_SETGID = SYS_SETGID sys_SETUID = SYS_SETUID ) diff --git a/src/syscall/syscall_linux.go b/src/syscall/syscall_linux.go index d2cb7c1afe..227a3ccdb9 100644 --- a/src/syscall/syscall_linux.go +++ b/src/syscall/syscall_linux.go @@ -13,6 +13,8 @@ package syscall import "unsafe" +func rawSyscallNoError(trap, a1, a2, a3 uintptr) (r1, r2 uintptr) + /* * Wrapped */ diff --git a/src/syscall/syscall_linux_test.go b/src/syscall/syscall_linux_test.go index 2c4d953561..becd267101 100644 --- a/src/syscall/syscall_linux_test.go +++ b/src/syscall/syscall_linux_test.go @@ -13,6 +13,9 @@ import ( "os/exec" "os/signal" "path/filepath" + "runtime" + "strconv" + "strings" "syscall" "testing" "time" @@ -23,6 +26,8 @@ func TestMain(m *testing.M) { deathSignalParent() } else if os.Getenv("GO_DEATHSIG_CHILD") == "1" { deathSignalChild() + } else if os.Getenv("GO_SYSCALL_NOERROR") == "1" { + syscallNoError() } os.Exit(m.Run()) @@ -166,3 +171,84 @@ func TestParseNetlinkMessage(t *testing.T) { } } } + +func TestSyscallNoError(t *testing.T) { + // On Linux there are currently no syscalls which don't fail and return + // a value larger than 0xfffffffffffff001 so we could test RawSyscall + // vs. RawSyscallNoError on 64bit architectures. + if runtime.GOARCH != "386" && runtime.GOARCH != "arm" { + t.Skip("skipping on non-32bit architecture") + } + + // TODO(tklauser) is this check enough? Otherwise test for being in a non-k8s + // Linux VM via testenv.Builder(). + if os.Getuid() != 0 { + t.Skip("skipping root only test") + } + + // Copy the test binary to a location that a non-root user can read/execute + // after we drop privileges + tempDir, err := ioutil.TempDir("", "TestSyscallNoError") + if err != nil { + t.Fatalf("cannot create temporary directory: %v", err) + } + defer os.RemoveAll(tempDir) + os.Chmod(tempDir, 0755) + + tmpBinary := filepath.Join(tempDir, filepath.Base(os.Args[0])) + + src, err := os.Open(os.Args[0]) + if err != nil { + t.Fatalf("cannot open binary %q, %v", os.Args[0], err) + } + defer src.Close() + + dst, err := os.OpenFile(tmpBinary, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0755) + if err != nil { + t.Fatalf("cannot create temporary binary %q, %v", tmpBinary, err) + } + if _, err := io.Copy(dst, src); err != nil { + t.Fatalf("failed to copy test binary to %q, %v", tmpBinary, err) + } + err = dst.Close() + if err != nil { + t.Fatalf("failed to close test binary %q, %v", tmpBinary, err) + } + + uid := uint32(0xfffffffe) + err = os.Chown(tmpBinary, int(uid), -1) + if err != nil { + t.Fatalf("failed to chown test binary %q, %v", tmpBinary, err) + } + + err = os.Chmod(tmpBinary, 0755|os.ModeSetuid) + if err != nil { + t.Fatalf("failed to set setuid bit on test binary %q, %v", tmpBinary, err) + } + + cmd := exec.Command(tmpBinary) + cmd.Env = []string{"GO_SYSCALL_NOERROR=1"} + + out, err := cmd.CombinedOutput() + if err != nil { + t.Fatalf("failed to start first child process: %v", err) + } + + got := strings.TrimSpace(string(out)) + want := strconv.FormatUint(uint64(uid)+1, 10) + " / " + + strconv.FormatUint(uint64(-uid), 10) + " / " + + strconv.FormatUint(uint64(uid), 10) + if got != want { + t.Errorf("expected %s, got %s", want, got) + } +} + +func syscallNoError() { + // Test that the return value from SYS_GETEUID32 (which cannot fail) + // doesn't get treated as an error (see https://golang.org/issue/22924) + euid1, _, e := syscall.RawSyscall(syscall.Sys_GETEUID, 0, 0, 0) + euid2, _ := syscall.RawSyscallNoError(syscall.Sys_GETEUID, 0, 0, 0) + + fmt.Println(uintptr(euid1), "/", int(e), "/", uintptr(euid2)) + os.Exit(0) +} diff --git a/src/syscall/zsyscall_linux_386.go b/src/syscall/zsyscall_linux_386.go index 86f8ec15fa..7e8cee7d01 100644 --- a/src/syscall/zsyscall_linux_386.go +++ b/src/syscall/zsyscall_linux_386.go @@ -501,7 +501,7 @@ func Getpgid(pid int) (pgid int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { - r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETPID, 0, 0, 0) pid = int(r0) return } @@ -509,7 +509,7 @@ func Getpid() (pid int) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { - r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETPPID, 0, 0, 0) ppid = int(r0) return } @@ -538,7 +538,7 @@ func Getrusage(who int, rusage *Rusage) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettid() (tid int) { - r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETTID, 0, 0, 0) tid = int(r0) return } @@ -945,7 +945,7 @@ func Times(tms *Tms) (ticks uintptr, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(mask int) (oldmask int) { - r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0) + r0, _ := rawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0) oldmask = int(r0) return } @@ -1216,7 +1216,7 @@ func Ftruncate(fd int, length int64) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { - r0, _, _ := RawSyscall(SYS_GETEGID32, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETEGID32, 0, 0, 0) egid = int(r0) return } @@ -1224,7 +1224,7 @@ func Getegid() (egid int) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (euid int) { - r0, _, _ := RawSyscall(SYS_GETEUID32, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETEUID32, 0, 0, 0) euid = int(r0) return } @@ -1232,7 +1232,7 @@ func Geteuid() (euid int) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { - r0, _, _ := RawSyscall(SYS_GETGID32, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETGID32, 0, 0, 0) gid = int(r0) return } @@ -1240,7 +1240,7 @@ func Getgid() (gid int) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { - r0, _, _ := RawSyscall(SYS_GETUID32, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETUID32, 0, 0, 0) uid = int(r0) return } diff --git a/src/syscall/zsyscall_linux_amd64.go b/src/syscall/zsyscall_linux_amd64.go index 6545d1a159..19619ee9d9 100644 --- a/src/syscall/zsyscall_linux_amd64.go +++ b/src/syscall/zsyscall_linux_amd64.go @@ -501,7 +501,7 @@ func Getpgid(pid int) (pgid int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { - r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETPID, 0, 0, 0) pid = int(r0) return } @@ -509,7 +509,7 @@ func Getpid() (pid int) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { - r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETPPID, 0, 0, 0) ppid = int(r0) return } @@ -538,7 +538,7 @@ func Getrusage(who int, rusage *Rusage) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettid() (tid int) { - r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETTID, 0, 0, 0) tid = int(r0) return } @@ -945,7 +945,7 @@ func Times(tms *Tms) (ticks uintptr, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(mask int) (oldmask int) { - r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0) + r0, _ := rawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0) oldmask = int(r0) return } @@ -1206,7 +1206,7 @@ func Ftruncate(fd int, length int64) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { - r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETEGID, 0, 0, 0) egid = int(r0) return } @@ -1214,7 +1214,7 @@ func Getegid() (egid int) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (euid int) { - r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETEUID, 0, 0, 0) euid = int(r0) return } @@ -1222,7 +1222,7 @@ func Geteuid() (euid int) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { - r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETGID, 0, 0, 0) gid = int(r0) return } @@ -1240,7 +1240,7 @@ func Getrlimit(resource int, rlim *Rlimit) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { - r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETUID, 0, 0, 0) uid = int(r0) return } diff --git a/src/syscall/zsyscall_linux_arm.go b/src/syscall/zsyscall_linux_arm.go index 0f0464bf1c..6924e862c1 100644 --- a/src/syscall/zsyscall_linux_arm.go +++ b/src/syscall/zsyscall_linux_arm.go @@ -501,7 +501,7 @@ func Getpgid(pid int) (pgid int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { - r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETPID, 0, 0, 0) pid = int(r0) return } @@ -509,7 +509,7 @@ func Getpid() (pid int) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { - r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETPPID, 0, 0, 0) ppid = int(r0) return } @@ -538,7 +538,7 @@ func Getrusage(who int, rusage *Rusage) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettid() (tid int) { - r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETTID, 0, 0, 0) tid = int(r0) return } @@ -945,7 +945,7 @@ func Times(tms *Tms) (ticks uintptr, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(mask int) (oldmask int) { - r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0) + r0, _ := rawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0) oldmask = int(r0) return } @@ -1375,7 +1375,7 @@ func Fstat(fd int, stat *Stat_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { - r0, _, _ := RawSyscall(SYS_GETEGID32, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETEGID32, 0, 0, 0) egid = int(r0) return } @@ -1383,7 +1383,7 @@ func Getegid() (egid int) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (euid int) { - r0, _, _ := RawSyscall(SYS_GETEUID32, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETEUID32, 0, 0, 0) euid = int(r0) return } @@ -1391,7 +1391,7 @@ func Geteuid() (euid int) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { - r0, _, _ := RawSyscall(SYS_GETGID32, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETGID32, 0, 0, 0) gid = int(r0) return } @@ -1399,7 +1399,7 @@ func Getgid() (gid int) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { - r0, _, _ := RawSyscall(SYS_GETUID32, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETUID32, 0, 0, 0) uid = int(r0) return } diff --git a/src/syscall/zsyscall_linux_arm64.go b/src/syscall/zsyscall_linux_arm64.go index 27470ac0c9..780a70bae9 100644 --- a/src/syscall/zsyscall_linux_arm64.go +++ b/src/syscall/zsyscall_linux_arm64.go @@ -501,7 +501,7 @@ func Getpgid(pid int) (pgid int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { - r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETPID, 0, 0, 0) pid = int(r0) return } @@ -509,7 +509,7 @@ func Getpid() (pid int) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { - r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETPPID, 0, 0, 0) ppid = int(r0) return } @@ -538,7 +538,7 @@ func Getrusage(who int, rusage *Rusage) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettid() (tid int) { - r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETTID, 0, 0, 0) tid = int(r0) return } @@ -945,7 +945,7 @@ func Times(tms *Tms) (ticks uintptr, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(mask int) (oldmask int) { - r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0) + r0, _ := rawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0) oldmask = int(r0) return } @@ -1211,7 +1211,7 @@ func Ftruncate(fd int, length int64) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { - r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETEGID, 0, 0, 0) egid = int(r0) return } @@ -1219,7 +1219,7 @@ func Getegid() (egid int) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (euid int) { - r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETEUID, 0, 0, 0) euid = int(r0) return } @@ -1227,7 +1227,7 @@ func Geteuid() (euid int) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { - r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETGID, 0, 0, 0) gid = int(r0) return } @@ -1245,7 +1245,7 @@ func Getrlimit(resource int, rlim *Rlimit) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { - r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETUID, 0, 0, 0) uid = int(r0) return } diff --git a/src/syscall/zsyscall_linux_ppc64.go b/src/syscall/zsyscall_linux_ppc64.go index 7df49c728a..e309440905 100644 --- a/src/syscall/zsyscall_linux_ppc64.go +++ b/src/syscall/zsyscall_linux_ppc64.go @@ -501,7 +501,7 @@ func Getpgid(pid int) (pgid int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { - r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETPID, 0, 0, 0) pid = int(r0) return } @@ -509,7 +509,7 @@ func Getpid() (pid int) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { - r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETPPID, 0, 0, 0) ppid = int(r0) return } @@ -538,7 +538,7 @@ func Getrusage(who int, rusage *Rusage) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettid() (tid int) { - r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETTID, 0, 0, 0) tid = int(r0) return } @@ -945,7 +945,7 @@ func Times(tms *Tms) (ticks uintptr, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(mask int) (oldmask int) { - r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0) + r0, _ := rawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0) oldmask = int(r0) return } @@ -1206,7 +1206,7 @@ func Ftruncate(fd int, length int64) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { - r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETEGID, 0, 0, 0) egid = int(r0) return } @@ -1214,7 +1214,7 @@ func Getegid() (egid int) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (euid int) { - r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETEUID, 0, 0, 0) euid = int(r0) return } @@ -1222,7 +1222,7 @@ func Geteuid() (euid int) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { - r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETGID, 0, 0, 0) gid = int(r0) return } @@ -1240,7 +1240,7 @@ func Getrlimit(resource int, rlim *Rlimit) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { - r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETUID, 0, 0, 0) uid = int(r0) return } diff --git a/src/syscall/zsyscall_linux_ppc64le.go b/src/syscall/zsyscall_linux_ppc64le.go index f073f7dbd1..6a3a80edc0 100644 --- a/src/syscall/zsyscall_linux_ppc64le.go +++ b/src/syscall/zsyscall_linux_ppc64le.go @@ -501,7 +501,7 @@ func Getpgid(pid int) (pgid int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { - r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETPID, 0, 0, 0) pid = int(r0) return } @@ -509,7 +509,7 @@ func Getpid() (pid int) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { - r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETPPID, 0, 0, 0) ppid = int(r0) return } @@ -538,7 +538,7 @@ func Getrusage(who int, rusage *Rusage) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettid() (tid int) { - r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETTID, 0, 0, 0) tid = int(r0) return } @@ -945,7 +945,7 @@ func Times(tms *Tms) (ticks uintptr, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(mask int) (oldmask int) { - r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0) + r0, _ := rawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0) oldmask = int(r0) return } @@ -1206,7 +1206,7 @@ func Ftruncate(fd int, length int64) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { - r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETEGID, 0, 0, 0) egid = int(r0) return } @@ -1214,7 +1214,7 @@ func Getegid() (egid int) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (euid int) { - r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETEUID, 0, 0, 0) euid = int(r0) return } @@ -1222,7 +1222,7 @@ func Geteuid() (euid int) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { - r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETGID, 0, 0, 0) gid = int(r0) return } @@ -1240,7 +1240,7 @@ func Getrlimit(resource int, rlim *Rlimit) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { - r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETUID, 0, 0, 0) uid = int(r0) return } diff --git a/src/syscall/zsyscall_linux_s390x.go b/src/syscall/zsyscall_linux_s390x.go index 689f2f472c..30fddf14f3 100644 --- a/src/syscall/zsyscall_linux_s390x.go +++ b/src/syscall/zsyscall_linux_s390x.go @@ -501,7 +501,7 @@ func Getpgid(pid int) (pgid int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { - r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETPID, 0, 0, 0) pid = int(r0) return } @@ -509,7 +509,7 @@ func Getpid() (pid int) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { - r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETPPID, 0, 0, 0) ppid = int(r0) return } @@ -538,7 +538,7 @@ func Getrusage(who int, rusage *Rusage) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettid() (tid int) { - r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETTID, 0, 0, 0) tid = int(r0) return } @@ -945,7 +945,7 @@ func Times(tms *Tms) (ticks uintptr, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(mask int) (oldmask int) { - r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0) + r0, _ := rawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0) oldmask = int(r0) return } @@ -1206,7 +1206,7 @@ func Ftruncate(fd int, length int64) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { - r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETEGID, 0, 0, 0) egid = int(r0) return } @@ -1214,7 +1214,7 @@ func Getegid() (egid int) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (euid int) { - r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETEUID, 0, 0, 0) euid = int(r0) return } @@ -1222,7 +1222,7 @@ func Geteuid() (euid int) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { - r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETGID, 0, 0, 0) gid = int(r0) return } @@ -1240,7 +1240,7 @@ func Getrlimit(resource int, rlim *Rlimit) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { - r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + r0, _ := rawSyscallNoError(SYS_GETUID, 0, 0, 0) uid = int(r0) return } -- 2.50.0