]> Cypherpunks repositories - gostls13.git/commitdiff
syscall: support syscalls without error return on Linux
authorTobias Klauser <tklauser@distanz.ch>
Mon, 18 Dec 2017 10:59:26 +0000 (11:59 +0100)
committerTobias Klauser <tobias.klauser@gmail.com>
Tue, 13 Feb 2018 15:57:31 +0000 (15:57 +0000)
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 <tobias.klauser@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
22 files changed:
src/syscall/asm_linux_386.s
src/syscall/asm_linux_amd64.s
src/syscall/asm_linux_arm.s
src/syscall/asm_linux_arm64.s
src/syscall/asm_linux_mips64x.s
src/syscall/asm_linux_mipsx.s
src/syscall/asm_linux_ppc64x.s
src/syscall/asm_linux_s390x.s
src/syscall/exec_linux.go
src/syscall/export_linux_test.go [new file with mode: 0644]
src/syscall/mksyscall.pl
src/syscall/setuidgid_32_linux.go
src/syscall/setuidgid_linux.go
src/syscall/syscall_linux.go
src/syscall/syscall_linux_test.go
src/syscall/zsyscall_linux_386.go
src/syscall/zsyscall_linux_amd64.go
src/syscall/zsyscall_linux_arm.go
src/syscall/zsyscall_linux_arm64.go
src/syscall/zsyscall_linux_ppc64.go
src/syscall/zsyscall_linux_ppc64le.go
src/syscall/zsyscall_linux_s390x.go

index 228a542cf1c8b3cf46e8270f273433b1edf8cc41..4201f367ba6ae25ec057170806b27ccfb7384e7f 100644 (file)
@@ -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
index b7cd5416fea7ac467f671473477368d3ba3c946b..7e05925d7f07374d25cebb837499417f18afaa5a 100644 (file)
@@ -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
index 997ba6f1c1e74f59c2e8447c1fb8c45a732c847d..4463a0f3e78990d1ffd867c94c8b12ad47e035cd 100644 (file)
@@ -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
index 184a44fd2f5bbe3670d08b68611bfa1db1d6a52b..7edeafca81ddbc871d9c1c73121973570d12456f 100644 (file)
@@ -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
index 81717d2588322e943d533db582a9055e1fe92d64..d0b0e5a0a877adcb5084f56b67a9d1eafc3bbe6e 100644 (file)
@@ -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
index 40ab82b83492d1cce32d04a6ac4ad6f6f2de0446..5727e4d41d031ec7f75f68beadb70756e1752b26 100644 (file)
@@ -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
index be6727cb1a610a0d69dd36a6067831a741489e5a..424efbbdc98b5b4a811af2241fae9aece88a306e 100644 (file)
@@ -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
index e22a92b9665bbd07cbfbadb35922bf40ee5296e8..62125f261027dc08613eff7e6ee255da9e35a48c 100644 (file)
@@ -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)
index bfbe2b3d592090efd289d4be7aeb78e07b73ceba..7ae3177fdc087859dc4834fe064a02095885e9a1 100644 (file)
@@ -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 (file)
index 0000000..274849e
--- /dev/null
@@ -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
index 699982e63cd2583f2f0edb671a7e273fff0ad1d2..894f828d59da1fe05aba916b4c6fc4729a62db57 100755 (executable)
@@ -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;
 
index 182f5d26a9084311b1fcb25abc43e4f5c73938f2..1fe7120d1c6abb802971c912f319ce79939eed66 100644 (file)
@@ -8,6 +8,8 @@
 package syscall
 
 const (
+       sys_GETEUID = SYS_GETEUID32
+
        sys_SETGID = SYS_SETGID32
        sys_SETUID = SYS_SETUID32
 )
index bf40d2d8829a739f844cd2e15a61dea363c6a373..22fa334bfa5e7c163e85ab648a5a87cadab255a5 100644 (file)
@@ -8,6 +8,8 @@
 package syscall
 
 const (
+       sys_GETEUID = SYS_GETEUID
+
        sys_SETGID = SYS_SETGID
        sys_SETUID = SYS_SETUID
 )
index d2cb7c1afe7c38d6c4c31c1262eb12fe8ecfcac3..227a3ccdb9d07e2e4580a68a7764e982df775521 100644 (file)
@@ -13,6 +13,8 @@ package syscall
 
 import "unsafe"
 
+func rawSyscallNoError(trap, a1, a2, a3 uintptr) (r1, r2 uintptr)
+
 /*
  * Wrapped
  */
index 2c4d953561a30ec45076468cb2a3a542f74ad59b..becd267101f64858abd903057910b4f1eefe60cf 100644 (file)
@@ -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)
+}
index 86f8ec15fa9ab454c33bfa358391ea5c446cf046..7e8cee7d01f0088d51588277d5ea85cc999dcd60 100644 (file)
@@ -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
 }
index 6545d1a159671a6fa0799b0878caa4ca85f29a56..19619ee9d903f99cfee80dd614e705d50c47ca3f 100644 (file)
@@ -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
 }
index 0f0464bf1ce752395b752fc18ec47b47a6872c50..6924e862c119b7ee9a2520e7d2cbfb8888cc22db 100644 (file)
@@ -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
 }
index 27470ac0c9cdf730be7838d6143f74a9833e10ce..780a70bae9c0f008f5bba0dc32e0075a209351e9 100644 (file)
@@ -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
 }
index 7df49c728ac4e33422080af55fd2436be4424dbe..e3094409051a5639c7a9413700509541d7db8590 100644 (file)
@@ -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
 }
index f073f7dbd112913e2b36e2c027d904313411d519..6a3a80edc0673665c71fe8fc0aa44df37a55d195 100644 (file)
@@ -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
 }
index 689f2f472c908cf042135f9c466ea0f7cd1f1543..30fddf14f34bde4eab4884f8f57e6896fbaabfc7 100644 (file)
@@ -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
 }