1
0
mirror of https://github.com/golang/go synced 2024-11-19 14:34:42 -07:00

runtime: use Android O friendly syscalls on 64-bit machines

Android O disallows open on 64-bit, so let's use openat with AT_FDCWD to
achieve the same behavior.

Android O disallows epoll_wait on 64-bit, so let's use epoll_pwait with
the last argument as NULL to achieve the same behavior.

See here:
https://android.googlesource.com/platform/bionic/+/master/libc/seccomp/arm64_app_policy.cpp
https://android.googlesource.com/platform/bionic/+/master/libc/seccomp/mips64_app_policy.cpp
https://android.googlesource.com/platform/bionic/+/master/libc/seccomp/x86_64_app_policy.cpp

Fixes #23750

Change-Id: If8d5a663357471e5d2c1f516151344a9d05b188a
Reviewed-on: https://go-review.googlesource.com/92895
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
Jason A. Donenfeld 2018-02-08 16:59:17 +01:00 committed by Brad Fitzpatrick
parent 4dad4ab57b
commit 04e6ae6bc3
2 changed files with 22 additions and 14 deletions

View File

@ -12,7 +12,6 @@
#define SYS_read 0 #define SYS_read 0
#define SYS_write 1 #define SYS_write 1
#define SYS_open 2
#define SYS_close 3 #define SYS_close 3
#define SYS_mmap 9 #define SYS_mmap 9
#define SYS_munmap 11 #define SYS_munmap 11
@ -41,9 +40,10 @@
#define SYS_sched_getaffinity 204 #define SYS_sched_getaffinity 204
#define SYS_epoll_create 213 #define SYS_epoll_create 213
#define SYS_exit_group 231 #define SYS_exit_group 231
#define SYS_epoll_wait 232
#define SYS_epoll_ctl 233 #define SYS_epoll_ctl 233
#define SYS_openat 257
#define SYS_pselect6 270 #define SYS_pselect6 270
#define SYS_epoll_pwait 281
#define SYS_epoll_create1 291 #define SYS_epoll_create1 291
TEXT runtime·exit(SB),NOSPLIT,$0-4 TEXT runtime·exit(SB),NOSPLIT,$0-4
@ -65,10 +65,12 @@ TEXT runtime·exitThread(SB),NOSPLIT,$0-8
JMP 0(PC) JMP 0(PC)
TEXT runtime·open(SB),NOSPLIT,$0-20 TEXT runtime·open(SB),NOSPLIT,$0-20
MOVQ name+0(FP), DI // This uses openat instead of open, because Android O blocks open.
MOVL mode+8(FP), SI MOVL $-100, DI // AT_FDCWD, so this acts like open
MOVL perm+12(FP), DX MOVQ name+0(FP), SI
MOVL $SYS_open, AX MOVL mode+8(FP), DX
MOVL perm+12(FP), R10
MOVL $SYS_openat, AX
SYSCALL SYSCALL
CMPQ AX, $0xfffffffffffff001 CMPQ AX, $0xfffffffffffff001
JLS 2(PC) JLS 2(PC)
@ -655,11 +657,13 @@ TEXT runtime·epollctl(SB),NOSPLIT,$0
// int32 runtime·epollwait(int32 epfd, EpollEvent *ev, int32 nev, int32 timeout); // int32 runtime·epollwait(int32 epfd, EpollEvent *ev, int32 nev, int32 timeout);
TEXT runtime·epollwait(SB),NOSPLIT,$0 TEXT runtime·epollwait(SB),NOSPLIT,$0
// This uses pwait instead of wait, because Android O blocks wait.
MOVL epfd+0(FP), DI MOVL epfd+0(FP), DI
MOVQ ev+8(FP), SI MOVQ ev+8(FP), SI
MOVL nev+16(FP), DX MOVL nev+16(FP), DX
MOVL timeout+20(FP), R10 MOVL timeout+20(FP), R10
MOVL $SYS_epoll_wait, AX MOVQ $0, R8
MOVL $SYS_epoll_pwait, AX
SYSCALL SYSCALL
MOVL AX, ret+24(FP) MOVL AX, ret+24(FP)
RET RET

View File

@ -16,7 +16,7 @@
#define SYS_exit 5058 #define SYS_exit 5058
#define SYS_read 5000 #define SYS_read 5000
#define SYS_write 5001 #define SYS_write 5001
#define SYS_open 5002 #define SYS_openat 5247
#define SYS_close 5003 #define SYS_close 5003
#define SYS_getpid 5038 #define SYS_getpid 5038
#define SYS_kill 5060 #define SYS_kill 5060
@ -42,7 +42,7 @@
#define SYS_exit_group 5205 #define SYS_exit_group 5205
#define SYS_epoll_create 5207 #define SYS_epoll_create 5207
#define SYS_epoll_ctl 5208 #define SYS_epoll_ctl 5208
#define SYS_epoll_wait 5209 #define SYS_epoll_pwait 5272
#define SYS_clock_gettime 5222 #define SYS_clock_gettime 5222
#define SYS_epoll_create1 5285 #define SYS_epoll_create1 5285
#define SYS_brk 5012 #define SYS_brk 5012
@ -67,10 +67,12 @@ TEXT runtime·exitThread(SB),NOSPLIT|NOFRAME,$0-8
JMP 0(PC) JMP 0(PC)
TEXT runtime·open(SB),NOSPLIT|NOFRAME,$0-20 TEXT runtime·open(SB),NOSPLIT|NOFRAME,$0-20
MOVV name+0(FP), R4 // This uses openat instead of open, because Android O blocks open.
MOVW mode+8(FP), R5 MOVW $-100, R4 // AT_FDCWD, so this acts like open
MOVW perm+12(FP), R6 MOVV name+0(FP), R5
MOVV $SYS_open, R2 MOVW mode+8(FP), R6
MOVW perm+12(FP), R7
MOVV $SYS_openat, R2
SYSCALL SYSCALL
BEQ R7, 2(PC) BEQ R7, 2(PC)
MOVW $-1, R2 MOVW $-1, R2
@ -423,11 +425,13 @@ TEXT runtime·epollctl(SB),NOSPLIT|NOFRAME,$0
// int32 runtime·epollwait(int32 epfd, EpollEvent *ev, int32 nev, int32 timeout); // int32 runtime·epollwait(int32 epfd, EpollEvent *ev, int32 nev, int32 timeout);
TEXT runtime·epollwait(SB),NOSPLIT|NOFRAME,$0 TEXT runtime·epollwait(SB),NOSPLIT|NOFRAME,$0
// This uses pwait instead of wait, because Android O blocks wait.
MOVW epfd+0(FP), R4 MOVW epfd+0(FP), R4
MOVV ev+8(FP), R5 MOVV ev+8(FP), R5
MOVW nev+16(FP), R6 MOVW nev+16(FP), R6
MOVW timeout+20(FP), R7 MOVW timeout+20(FP), R7
MOVV $SYS_epoll_wait, R2 MOVV $0, R8
MOVV $SYS_epoll_pwait, R2
SYSCALL SYSCALL
MOVW R2, ret+24(FP) MOVW R2, ret+24(FP)
RET RET