diff options
Diffstat (limited to 'libc')
99 files changed, 2302 insertions, 2314 deletions
diff --git a/libc/Android.bp b/libc/Android.bp index 3ff5c0319..2ea851466 100644 --- a/libc/Android.bp +++ b/libc/Android.bp @@ -10,15 +10,12 @@ libc_common_src_files = [ "bionic/pututline.c", "bionic/sched_cpualloc.c", "bionic/sched_cpucount.c", - "bionic/sigblock.c", - "bionic/siginterrupt.c", - "bionic/sigsetmask.c", "stdio/fmemopen.cpp", "stdio/parsefloat.c", "stdio/refill.c", "stdio/stdio.cpp", "stdio/stdio_ext.cpp", - "stdio/vfscanf.c", + "stdio/vfscanf.cpp", "stdio/vfwscanf.c", "stdlib/exit.c", ] @@ -39,6 +36,7 @@ libc_common_flags = [ "-Wall", "-Wextra", "-Wunused", + "-Wno-char-subscripts", "-Wno-deprecated-declarations", "-Wno-gcc-compat", "-Wframe-larger-than=2048", @@ -1335,25 +1333,7 @@ cc_library_static { "bionic/seteuid.cpp", "bionic/setpgrp.cpp", "bionic/sigaction.cpp", - "bionic/sigaddset.cpp", - "bionic/sigdelset.cpp", - "bionic/sigemptyset.cpp", - "bionic/sigfillset.cpp", - "bionic/sighold.cpp", - "bionic/sigignore.cpp", - "bionic/sigismember.cpp", "bionic/signal.cpp", - "bionic/signalfd.cpp", - "bionic/sigpause.cpp", - "bionic/sigpending.cpp", - "bionic/sigprocmask.cpp", - "bionic/sigqueue.cpp", - "bionic/sigrelse.cpp", - "bionic/sigset.cpp", - "bionic/sigsuspend.cpp", - "bionic/sigtimedwait.cpp", - "bionic/sigwait.cpp", - "bionic/sigwaitinfo.cpp", "bionic/socket.cpp", "bionic/spawn.cpp", "bionic/stat.cpp", @@ -1374,6 +1354,7 @@ cc_library_static { "bionic/sys_sem.cpp", "bionic/sys_shm.cpp", "bionic/sys_siglist.c", + "bionic/sys_signalfd.cpp", "bionic/sys_signame.c", "bionic/sys_time.cpp", "bionic/sysinfo.cpp", @@ -1669,6 +1650,7 @@ cc_library_static { cc_library { defaults: ["libc_defaults"], name: "libc", + static_ndk_lib: true, product_variables: { platform_sdk_version: { asflags: ["-DPLATFORM_SDK_VERSION=%d"], @@ -1723,6 +1705,9 @@ cc_library { arch: { arm: { + //TODO: This is to work around b/24465209. Remove after root cause is fixed + ldflags: ["-Wl,--hash-style=both"], + // Don't re-export new/delete and friends, even if the compiler really wants to. version_script: "libc.arm.map", @@ -1753,6 +1738,9 @@ cc_library { version_script: "libc.mips64.map", }, x86: { + //TODO: This is to work around b/24465209. Remove after root cause is fixed + ldflags: ["-Wl,--hash-style=both"], + // Don't re-export new/delete and friends, even if the compiler really wants to. version_script: "libc.x86.map", }, @@ -1775,11 +1763,14 @@ cc_library { "bionic/new.cpp", ], name: "libstdc++", + static_ndk_lib: true, system_shared_libs: ["libc"], static_libs: ["libasync_safe"], + //TODO (dimitry): This is to work around b/24465209. Remove after root cause is fixed arch: { arm: { + ldflags: ["-Wl,--hash-style=both"], version_script: "libstdc++.arm.map", }, arm64: { @@ -1792,6 +1783,7 @@ cc_library { version_script: "libstdc++.mips64.map", }, x86: { + ldflags: ["-Wl,--hash-style=both"], version_script: "libstdc++.x86.map", }, x86_64: { diff --git a/libc/SECCOMP_BLACKLIST_APP.TXT b/libc/SECCOMP_BLACKLIST_APP.TXT new file mode 100644 index 000000000..25542d68c --- /dev/null +++ b/libc/SECCOMP_BLACKLIST_APP.TXT @@ -0,0 +1,68 @@ +# This file is used to populate seccomp's whitelist policy in combination with SYSCALLS.TXT. +# Note that the resultant policy is applied only to zygote spawned processes. +# +# The final seccomp whitelist is SYSCALLS.TXT - SECCOMP_BLACKLIST.TXT + SECCOMP_WHITELIST.TXT +# Any entry in the blacklist must be in the syscalls file and not be in the whitelist file +# +# Each non-blank, non-comment line has the following format: +# +# return_type func_name[|alias_list][:syscall_name[:socketcall_id]]([parameter_list]) arch_list +# +# where: +# arch_list ::= "all" | arch+ +# arch ::= "arm" | "arm64" | "mips" | "mips64" | "x86" | "x86_64" +# +# Note: +# - syscall_name corresponds to the name of the syscall, which may differ from +# the exported function name (example: the exit syscall is implemented by the _exit() +# function, which is not the same as the standard C exit() function which calls it) + +# - alias_list is optional comma separated list of function aliases +# +# - The call_id parameter, given that func_name and syscall_name have +# been provided, allows the user to specify dispatch style syscalls. +# For example, socket() syscall on i386 actually becomes: +# socketcall(__NR_socket, 1, *(rest of args on stack)). +# +# - Each parameter type is assumed to be stored in 32 bits. +# +# This file is processed by a python script named genseccomp.py. + +# syscalls to modify IDs +int setgid:setgid32(gid_t) arm,x86 +int setgid:setgid(gid_t) arm64,mips,mips64,x86_64 +int setuid:setuid32(uid_t) arm,x86 +int setuid:setuid(uid_t) arm64,mips,mips64,x86_64 +int setreuid:setreuid32(uid_t, uid_t) arm,x86 +int setreuid:setreuid(uid_t, uid_t) arm64,mips,mips64,x86_64 +int setresuid:setresuid32(uid_t, uid_t, uid_t) arm,x86 +int setresuid:setresuid(uid_t, uid_t, uid_t) arm64,mips,mips64,x86_64 +int setresgid:setresgid32(gid_t, gid_t, gid_t) arm,x86 +int setresgid:setresgid(gid_t, gid_t, gid_t) arm64,mips,mips64,x86_64 +int setfsgid(gid_t) all +int setfsuid(uid_t) all +int setgroups:setgroups32(int, const gid_t*) arm,x86 +int setgroups:setgroups(int, const gid_t*) arm64,mips,mips64,x86_64 + +# syscalls to modify times +int adjtimex(struct timex*) all +int clock_adjtime(clockid_t, struct timex*) all +int clock_settime(clockid_t, const struct timespec*) all +int settimeofday(const struct timeval*, const struct timezone*) all + +int acct(const char* filepath) all +int klogctl:syslog(int, char*, int) all + +int capset(cap_user_header_t header, const cap_user_data_t data) all +int chroot(const char*) all + +# syscalls to change machine various configurations +int init_module(void*, unsigned long, const char*) all +int delete_module(const char*, unsigned int) all +int mount(const char*, const char*, const char*, unsigned long, const void*) all +int umount2(const char*, int) all +int swapon(const char*, int) all +int swapoff(const char*) all +int setdomainname(const char*, size_t) all +int sethostname(const char*, size_t) all +int __reboot:reboot(int, int, int, void*) all diff --git a/libc/SECCOMP_WHITELIST_SYSTEM.TXT b/libc/SECCOMP_WHITELIST_SYSTEM.TXT index 2f3618c44..155867ffc 100644 --- a/libc/SECCOMP_WHITELIST_SYSTEM.TXT +++ b/libc/SECCOMP_WHITELIST_SYSTEM.TXT @@ -24,3 +24,5 @@ # - Each parameter type is assumed to be stored in 32 bits. # # This file is processed by a python script named genseccomp.py. + +int bpf(int cmd, union bpf_attr *attr, unsigned int size) all diff --git a/libc/arch-arm/bionic/exidx_static.c b/libc/arch-arm/bionic/exidx_static.c index 72c0a5bc0..1686d6acb 100644 --- a/libc/arch-arm/bionic/exidx_static.c +++ b/libc/arch-arm/bionic/exidx_static.c @@ -30,7 +30,7 @@ /* Find the .ARM.exidx section (which in the case of a static executable * can be identified through its start and end symbols), and return its - * beginning and numbe of entries to the caller. Note that for static + * beginning and number of entries to the caller. Note that for static * executables we do not need to use the value of the PC to find the * EXIDX section. */ @@ -38,9 +38,7 @@ extern unsigned __exidx_end; extern unsigned __exidx_start; -_Unwind_Ptr __gnu_Unwind_Find_exidx(_Unwind_Ptr pc __attribute__((unused)), - int *pcount) -{ - *pcount = (__exidx_end-__exidx_start)/8; - return (_Unwind_Ptr)__exidx_start; +_Unwind_Ptr __gnu_Unwind_Find_exidx(_Unwind_Ptr pc __attribute__((unused)), int* pcount) { + *pcount = (&__exidx_end - &__exidx_start) / 8; + return (_Unwind_Ptr)&__exidx_start; } diff --git a/libc/arch-arm/bionic/setjmp.S b/libc/arch-arm/bionic/setjmp.S index b814124ea..c10bd3e6c 100644 --- a/libc/arch-arm/bionic/setjmp.S +++ b/libc/arch-arm/bionic/setjmp.S @@ -218,8 +218,10 @@ __BIONIC_WEAK_ASM_FOR_NATIVE_BRIDGE(siglongjmp) beq 1f // Restore the signal mask. - ldr r0, [r0, #(_JB_SIGMASK * 4)] - bl sigsetmask + mov r2, #0 + add r1, r0, #(_JB_SIGMASK * 4) + mov r0, #2 // SIG_SETMASK + bl sigprocmask 1: ldmfd sp!, {r0, r1, lr} diff --git a/libc/arch-common/bionic/crtbegin.c b/libc/arch-common/bionic/crtbegin.c index 45c9ea707..31ad62184 100644 --- a/libc/arch-common/bionic/crtbegin.c +++ b/libc/arch-common/bionic/crtbegin.c @@ -36,7 +36,7 @@ SECTION(".init_array") void (*__INIT_ARRAY__)(void) = (void (*)(void)) -1; SECTION(".fini_array") void (*__FINI_ARRAY__)(void) = (void (*)(void)) -1; #undef SECTION -static void _start_main(void* raw_args) __used { +__used static void _start_main(void* raw_args) { structors_array_t array; array.preinit_array = &__PREINIT_ARRAY__; array.init_array = &__INIT_ARRAY__; @@ -66,3 +66,6 @@ __asm__(PRE "movq %rsp,%rdi; andq $~0xf,%rsp; callq _start_main" POST); #include "__dso_handle.h" #include "atexit.h" #include "pthread_atfork.h" +#ifdef __i386__ +# include "../../arch-x86/bionic/__stack_chk_fail_local.h" +#endif diff --git a/libc/arch-common/bionic/crtbegin_so.c b/libc/arch-common/bionic/crtbegin_so.c index 258a6cd71..3754363ab 100644 --- a/libc/arch-common/bionic/crtbegin_so.c +++ b/libc/arch-common/bionic/crtbegin_so.c @@ -57,3 +57,6 @@ void __on_dlclose() { # include "atexit.h" #endif #include "pthread_atfork.h" +#ifdef __i386__ +# include "../../arch-x86/bionic/__stack_chk_fail_local.h" +#endif diff --git a/libc/arch-common/bionic/pthread_atfork.h b/libc/arch-common/bionic/pthread_atfork.h index 0c48a1269..c6a33ffe0 100644 --- a/libc/arch-common/bionic/pthread_atfork.h +++ b/libc/arch-common/bionic/pthread_atfork.h @@ -14,6 +14,12 @@ * limitations under the License. */ +#include <android/api-level.h> + +// __register_atfork wasn't available until android-23. We need to build a +// pre-23 and 23+ version of crtbegin. +#if __ANDROID_API__ >= __ANDROID_API_M__ + extern void* __dso_handle; extern int __register_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(void), void* dso); @@ -27,3 +33,4 @@ int pthread_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(vo return __register_atfork(prepare, parent, child, &__dso_handle); } +#endif /* __ANDROID_API__ >= __ANDROID_API_M__ */ diff --git a/libc/bionic/sigwait.cpp b/libc/arch-x86/bionic/__stack_chk_fail_local.h index 2534b89f0..0b0fd7f8b 100644 --- a/libc/bionic/sigwait.cpp +++ b/libc/arch-x86/bionic/__stack_chk_fail_local.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008 The Android Open Source Project + * Copyright (C) 2012 The Android Open Source Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -26,28 +26,32 @@ * SUCH DAMAGE. */ -#include <errno.h> -#include <signal.h> -#include <string.h> -#include <time.h> - -#include "private/kernel_sigset_t.h" - -extern "C" int __rt_sigtimedwait(const sigset_t*, siginfo_t*, const timespec*, size_t); - -int sigwait(const sigset_t* set, int* sig) { - kernel_sigset_t sigset(set); - while (true) { - // __rt_sigtimedwait can return EAGAIN or EINTR, we need to loop - // around them since sigwait is only allowed to return EINVAL. - int result = __rt_sigtimedwait(sigset.get(), NULL, NULL, sizeof(sigset)); - if (result >= 0) { - *sig = result; - return 0; - } - - if (errno != EAGAIN && errno != EINTR) { - return errno; - } - } +#include <sys/cdefs.h> + +/* + __stack_chk_fail routine is runtime part of stack protector compiler + feature. It's implemented in libc and represents die routine when stack + corruption is detected. + + Calls are generated by compiler and injected into user functions when + -fstack-protector* options are used. + + __stack_chk_fail_local is wrapper for __stack_chk_fail. Compiler generates + wrapper calls instead for PIC code only and only on IA32 for optimization + purpose (see gcc/config/i386/i386.c). Wrapper body is always included into + executable or library. This is the idea of optimization. + + Glibc is doing this via libc_nonshared.a which is linked automatically + everytime with libc.so. In bionic we have to bring it within crtfiles + because libc.so is real library and not a link script like libc.so at glibc. + + For x86_64 or non-PIC code compiler always generates __stack_chk_fail calls. +*/ + +#ifdef __i386__ +extern void __stack_chk_fail(); + +__LIBC_HIDDEN__ void __stack_chk_fail_local() { + __stack_chk_fail(); } +#endif diff --git a/libc/arch-x86/bionic/setjmp.S b/libc/arch-x86/bionic/setjmp.S index 6e6c3650a..f9f7cd746 100644 --- a/libc/arch-x86/bionic/setjmp.S +++ b/libc/arch-x86/bionic/setjmp.S @@ -110,16 +110,17 @@ __BIONIC_WEAK_ASM_FOR_NATIVE_BRIDGE(sigsetjmp) testl $1,%eax jz 1f - // Get the current signal mask. + // Save the current signal mask. + pushl %ecx PIC_PROLOGUE - pushl $0 - call PIC_PLT(sigblock) - addl $4,%esp + leal (_JB_SIGMASK * 4)(%ecx),%eax + pushl %eax + pushl $0 // NULL + pushl $2 // SIG_SETMASK + call PIC_PLT(sigprocmask) + addl $12,%esp PIC_EPILOGUE - - // Save the signal mask. - movl 4(%esp),%ecx - movl %eax,(_JB_SIGMASK * 4)(%ecx) + popl %ecx 1: // Fetch the setjmp cookie and clear the signal flag bit. @@ -159,10 +160,13 @@ __BIONIC_WEAK_ASM_FOR_NATIVE_BRIDGE(siglongjmp) jz 1f // Restore the signal mask. + leal (_JB_SIGMASK * 4)(%edx),%eax PIC_PROLOGUE - pushl (_JB_SIGMASK * 4)(%edx) - call PIC_PLT(sigsetmask) - addl $4,%esp + pushl $0 // NULL + pushl %eax + pushl $2 // SIG_SETMASK + call PIC_PLT(sigprocmask) + addl $12,%esp PIC_EPILOGUE 1: diff --git a/libc/bionic/abort.cpp b/libc/bionic/abort.cpp index f401cab90..9f1c31f3d 100644 --- a/libc/bionic/abort.cpp +++ b/libc/bionic/abort.cpp @@ -32,6 +32,8 @@ #include <sys/syscall.h> #include <unistd.h> +#include "private/kernel_sigset_t.h" + // We call tgkill(2) directly instead of raise (or even the libc tgkill wrapper), to reduce the // number of uninteresting stack frames at the top of a crash. static inline __always_inline void inline_tgkill(pid_t pid, pid_t tid, int sig) { @@ -60,10 +62,10 @@ void abort() { // Don't block SIGABRT to give any signal handler a chance; we ignore // any errors -- X311J doesn't allow abort to return anyway. - sigset_t mask; - sigfillset(&mask); - sigdelset(&mask, SIGABRT); - sigprocmask(SIG_SETMASK, &mask, NULL); + kernel_sigset_t mask; + mask.fill(); + mask.clear(SIGABRT); + __rt_sigprocmask(SIG_SETMASK, &mask, nullptr, sizeof(mask)); inline_tgkill(pid, tid, SIGABRT); @@ -74,7 +76,7 @@ void abort() { sa.sa_flags = SA_RESTART; sigemptyset(&sa.sa_mask); sigaction(SIGABRT, &sa, &sa); - sigprocmask(SIG_SETMASK, &mask, NULL); + __rt_sigprocmask(SIG_SETMASK, &mask, nullptr, sizeof(mask)); inline_tgkill(pid, tid, SIGABRT); diff --git a/libc/bionic/bionic_futex.cpp b/libc/bionic/bionic_futex.cpp index dd66e405e..0ac1f6ea6 100644 --- a/libc/bionic/bionic_futex.cpp +++ b/libc/bionic/bionic_futex.cpp @@ -32,8 +32,9 @@ #include "private/bionic_time_conversions.h" -int __futex_wait_ex(volatile void* ftx, bool shared, int value, bool use_realtime_clock, - const timespec* abs_timeout) { +static inline __always_inline int FutexWithTimeout(volatile void* ftx, int op, int value, + bool use_realtime_clock, + const timespec* abs_timeout, int bitset) { const timespec* futex_abs_timeout = abs_timeout; // pthread's and semaphore's default behavior is to use CLOCK_REALTIME, however this behavior is // essentially never intended, as that clock is prone to change discontinuously. @@ -54,6 +55,17 @@ int __futex_wait_ex(volatile void* ftx, bool shared, int value, bool use_realtim futex_abs_timeout = &converted_monotonic_abs_timeout; } - return __futex(ftx, (shared ? FUTEX_WAIT_BITSET : FUTEX_WAIT_BITSET_PRIVATE), value, - futex_abs_timeout, FUTEX_BITSET_MATCH_ANY); + return __futex(ftx, op, value, futex_abs_timeout, bitset); +} + +int __futex_wait_ex(volatile void* ftx, bool shared, int value, bool use_realtime_clock, + const timespec* abs_timeout) { + return FutexWithTimeout(ftx, (shared ? FUTEX_WAIT_BITSET : FUTEX_WAIT_BITSET_PRIVATE), value, + use_realtime_clock, abs_timeout, FUTEX_BITSET_MATCH_ANY); +} + +int __futex_pi_lock_ex(volatile void* ftx, bool shared, bool use_realtime_clock, + const timespec* abs_timeout) { + return FutexWithTimeout(ftx, (shared ? FUTEX_LOCK_PI : FUTEX_LOCK_PI_PRIVATE), 0, + use_realtime_clock, abs_timeout, 0); } diff --git a/libc/bionic/bionic_systrace.cpp b/libc/bionic/bionic_systrace.cpp index 970a92ba1..bac3d8802 100644 --- a/libc/bionic/bionic_systrace.cpp +++ b/libc/bionic/bionic_systrace.cpp @@ -29,12 +29,11 @@ #define WRITE_OFFSET 32 static Lock g_lock; +static CachedProperty g_debug_atrace_tags_enableflags("debug.atrace.tags.enableflags"); +static uint64_t g_tags; static int g_trace_marker_fd = -1; static bool should_trace() { - static CachedProperty g_debug_atrace_tags_enableflags("debug.atrace.tags.enableflags"); - static uint64_t g_tags; - g_lock.lock(); if (g_debug_atrace_tags_enableflags.DidChange()) { g_tags = strtoull(g_debug_atrace_tags_enableflags.Get(), nullptr, 0); diff --git a/libc/bionic/icu.cpp b/libc/bionic/icu.cpp index 78e551bc3..c09c9eac1 100644 --- a/libc/bionic/icu.cpp +++ b/libc/bionic/icu.cpp @@ -68,7 +68,7 @@ static bool __find_icu() { } free(namelist); - if (max_version == -1 || max_version < ICUDATA_VERSION_MIN) { + if (max_version < ICUDATA_VERSION_MIN) { async_safe_write_log(ANDROID_LOG_ERROR, "bionic-icu", "couldn't find an ICU .dat file"); return false; } diff --git a/libc/bionic/pause.cpp b/libc/bionic/pause.cpp index 94a16fbfa..2a0779a5c 100644 --- a/libc/bionic/pause.cpp +++ b/libc/bionic/pause.cpp @@ -30,13 +30,8 @@ #include "private/kernel_sigset_t.h" -extern "C" int __rt_sigprocmask(int, const kernel_sigset_t*, kernel_sigset_t*, size_t); -extern "C" int __rt_sigsuspend(const kernel_sigset_t*, size_t); - int pause() { kernel_sigset_t mask; - if (__rt_sigprocmask(SIG_SETMASK, NULL, &mask, sizeof(mask)) == -1) { - return -1; - } + if (__rt_sigprocmask(SIG_SETMASK, nullptr, &mask, sizeof(mask)) == -1) return -1; return __rt_sigsuspend(&mask, sizeof(mask)); } diff --git a/libc/bionic/posix_timers.cpp b/libc/bionic/posix_timers.cpp index c46965f38..e3bb112fb 100644 --- a/libc/bionic/posix_timers.cpp +++ b/libc/bionic/posix_timers.cpp @@ -74,8 +74,7 @@ static __kernel_timer_t to_kernel_timer_id(timer_t timer) { static void* __timer_thread_start(void* arg) { PosixTimer* timer = reinterpret_cast<PosixTimer*>(arg); - kernel_sigset_t sigset; - sigaddset(sigset.get(), TIMER_SIGNAL); + kernel_sigset_t sigset{TIMER_SIGNAL}; while (true) { // Wait for a signal... @@ -150,14 +149,13 @@ int timer_create(clockid_t clock_id, sigevent* evp, timer_t* timer_id) { // We start the thread with TIMER_SIGNAL blocked by blocking the signal here and letting it // inherit. If it tried to block the signal itself, there would be a race. - kernel_sigset_t sigset; - sigaddset(sigset.get(), TIMER_SIGNAL); + kernel_sigset_t sigset{TIMER_SIGNAL}; kernel_sigset_t old_sigset; - pthread_sigmask(SIG_BLOCK, sigset.get(), old_sigset.get()); + __rt_sigprocmask(SIG_BLOCK, &sigset, &old_sigset, sizeof(sigset)); int rc = pthread_create(&timer->callback_thread, &thread_attributes, __timer_thread_start, timer); - pthread_sigmask(SIG_SETMASK, old_sigset.get(), NULL); + __rt_sigprocmask(SIG_SETMASK, &old_sigset, nullptr, sizeof(sigset)); if (rc != 0) { free(timer); diff --git a/libc/bionic/pthread_exit.cpp b/libc/bionic/pthread_exit.cpp index 8b4c44e15..f1b65fdf7 100644 --- a/libc/bionic/pthread_exit.cpp +++ b/libc/bionic/pthread_exit.cpp @@ -34,6 +34,7 @@ #include <sys/mman.h> #include "private/bionic_defs.h" +#include "private/ScopedSignalBlocker.h" #include "pthread_internal.h" extern "C" __noreturn void _exit_with_stack_teardown(void*, size_t); @@ -63,6 +64,12 @@ void __pthread_cleanup_pop(__pthread_cleanup_t* c, int execute) { } } +static void __pthread_unmap_tls(pthread_internal_t* thread) { + // Unmap the bionic TLS, including guard pages. + void* allocation = reinterpret_cast<char*>(thread->bionic_tls) - PTHREAD_GUARD_SIZE; + munmap(allocation, BIONIC_TLS_SIZE + 2 * PTHREAD_GUARD_SIZE); +} + __BIONIC_WEAK_FOR_NATIVE_BRIDGE void pthread_exit(void* return_value) { // Call dtors for thread_local objects first. @@ -96,10 +103,6 @@ void pthread_exit(void* return_value) { thread->alternate_signal_stack = NULL; } - // Unmap the bionic TLS, including guard pages. - void* allocation = reinterpret_cast<char*>(thread->bionic_tls) - PTHREAD_GUARD_SIZE; - munmap(allocation, BIONIC_TLS_SIZE + 2 * PTHREAD_GUARD_SIZE); - ThreadJoinState old_state = THREAD_NOT_JOINED; while (old_state == THREAD_NOT_JOINED && !atomic_compare_exchange_weak(&thread->join_state, &old_state, THREAD_EXITED_NOT_JOINED)) { @@ -120,16 +123,15 @@ void pthread_exit(void* return_value) { // That's not something we can do in C. // We don't want to take a signal after we've unmapped the stack. - // That's one last thing we can handle in C. - sigset_t mask; - sigfillset(&mask); - sigprocmask(SIG_SETMASK, &mask, NULL); - + // That's one last thing we can do before dropping to assembler. + ScopedSignalBlocker ssb; + __pthread_unmap_tls(thread); _exit_with_stack_teardown(thread->attr.stack_base, thread->mmap_size); } } // No need to free mapped space. Either there was no space mapped, or it is left for // the pthread_join caller to clean up. + __pthread_unmap_tls(thread); __exit(0); } diff --git a/libc/bionic/pthread_mutex.cpp b/libc/bionic/pthread_mutex.cpp index 14e0ab0c5..ed90639e3 100644 --- a/libc/bionic/pthread_mutex.cpp +++ b/libc/bionic/pthread_mutex.cpp @@ -49,9 +49,13 @@ * bits: name description * 0-3 type type of mutex * 4 shared process-shared flag + * 5 protocol whether it is a priority inherit mutex. */ #define MUTEXATTR_TYPE_MASK 0x000f #define MUTEXATTR_SHARED_MASK 0x0010 +#define MUTEXATTR_PROTOCOL_MASK 0x0020 + +#define MUTEXATTR_PROTOCOL_SHIFT 5 int pthread_mutexattr_init(pthread_mutexattr_t *attr) { @@ -113,17 +117,119 @@ int pthread_mutexattr_getpshared(const pthread_mutexattr_t* attr, int* pshared) return 0; } -/* a mutex contains a state value and a owner_tid. - * The value is implemented as a 16-bit integer holding the following fields: - * - * bits: name description - * 15-14 type mutex type - * 13 shared process-shared flag - * 12-2 counter counter of recursive mutexes - * 1-0 state lock state (0, 1 or 2) - * - * The owner_tid is used only in recursive and errorcheck mutex to hold the mutex owner thread tid. - */ +int pthread_mutexattr_setprotocol(pthread_mutexattr_t* attr, int protocol) { + if (protocol != PTHREAD_PRIO_NONE && protocol != PTHREAD_PRIO_INHERIT) { + return EINVAL; + } + *attr = (*attr & ~MUTEXATTR_PROTOCOL_MASK) | (protocol << MUTEXATTR_PROTOCOL_SHIFT); + return 0; +} + +int pthread_mutexattr_getprotocol(const pthread_mutexattr_t* attr, int* protocol) { + *protocol = (*attr & MUTEXATTR_PROTOCOL_MASK) >> MUTEXATTR_PROTOCOL_SHIFT; + return 0; +} + +#if defined(__LP64__) + +// Priority Inheritance mutex implementation +struct PIMutex { + // mutex type, can be 0 (normal), 1 (recursive), 2 (errorcheck), constant during lifetime + uint8_t type; + // process-shared flag, constant during lifetime + bool shared; + // <number of times a thread holding a recursive PI mutex> - 1 + uint16_t counter; + // owner_tid is read/written by both userspace code and kernel code. It includes three fields: + // FUTEX_WAITERS, FUTEX_OWNER_DIED and FUTEX_TID_MASK. + atomic_int owner_tid; +}; + +static inline __always_inline int PIMutexTryLock(PIMutex& mutex) { + pid_t tid = __get_thread()->tid; + // Handle common case first. + int old_owner = 0; + if (__predict_true(atomic_compare_exchange_strong_explicit(&mutex.owner_tid, + &old_owner, tid, + memory_order_acquire, + memory_order_relaxed))) { + return 0; + } + if (tid == (old_owner & FUTEX_TID_MASK)) { + // We already own this mutex. + if (mutex.type == PTHREAD_MUTEX_NORMAL) { + return EBUSY; + } + if (mutex.type == PTHREAD_MUTEX_ERRORCHECK) { + return EDEADLK; + } + if (mutex.counter == 0xffff) { + return EAGAIN; + } + mutex.counter++; + return 0; + } + return EBUSY; +} + +static int PIMutexTimedLock(PIMutex& mutex, const timespec* abs_timeout) { + int ret = PIMutexTryLock(mutex); + if (__predict_true(ret == 0)) { + return 0; + } + if (ret == EBUSY) { + ret = -__futex_pi_lock_ex(&mutex.owner_tid, mutex.shared, true, abs_timeout); + } + return ret; +} + +static int PIMutexUnlock(PIMutex& mutex) { + pid_t tid = __get_thread()->tid; + int old_owner = tid; + // Handle common case first. + if (__predict_true(mutex.type == PTHREAD_MUTEX_NORMAL)) { + if (__predict_true(atomic_compare_exchange_strong_explicit(&mutex.owner_tid, + &old_owner, 0, + memory_order_release, + memory_order_relaxed))) { + return 0; + } + } + + if (tid != (old_owner & FUTEX_TID_MASK)) { + // The mutex can only be unlocked by the thread who owns it. + return EPERM; + } + if (mutex.type == PTHREAD_MUTEX_RECURSIVE) { + if (mutex.counter != 0u) { + --mutex.counter; + return 0; + } + } + if (old_owner == tid) { + // No thread is waiting. + if (__predict_true(atomic_compare_exchange_strong_explicit(&mutex.owner_tid, + &old_owner, 0, + memory_order_release, + memory_order_relaxed))) { + return 0; + } + } + return -__futex_pi_unlock(&mutex.owner_tid, mutex.shared); +} + +static int PIMutexDestroy(PIMutex& mutex) { + // The mutex should be in unlocked state (owner_tid == 0) when destroyed. + // Store 0xffffffff to make the mutex unusable. + int old_owner = 0; + if (atomic_compare_exchange_strong_explicit(&mutex.owner_tid, &old_owner, 0xffffffff, + memory_order_relaxed, memory_order_relaxed)) { + return 0; + } + return EBUSY; +} +#endif // defined(__LP64__) + /* Convenience macro, creates a mask of 'bits' bits that starts from * the 'shift'-th least significant bit in a 32-bit word. @@ -139,7 +245,6 @@ int pthread_mutexattr_getpshared(const pthread_mutexattr_t* attr, int* pshared) /* And this one does the opposite, i.e. extract a field's value from a bit pattern */ #define FIELD_FROM_BITS(val,shift,bits) (((val) >> (shift)) & ((1 << (bits))-1)) - /* Convenience macros. * * These are used to form or modify the bit pattern of a given mutex value @@ -214,13 +319,47 @@ int pthread_mutexattr_getpshared(const pthread_mutexattr_t* attr, int* pshared) #define MUTEX_TYPE_BITS_NORMAL MUTEX_TYPE_TO_BITS(PTHREAD_MUTEX_NORMAL) #define MUTEX_TYPE_BITS_RECURSIVE MUTEX_TYPE_TO_BITS(PTHREAD_MUTEX_RECURSIVE) #define MUTEX_TYPE_BITS_ERRORCHECK MUTEX_TYPE_TO_BITS(PTHREAD_MUTEX_ERRORCHECK) - +// Use a special mutex type to mark priority inheritance mutexes. +#define MUTEX_TYPE_BITS_WITH_PI MUTEX_TYPE_TO_BITS(3) + +// For a PI mutex, it includes below fields: +// Atomic(uint16_t) state; +// PIMutex pi_mutex; +// +// state holds the following fields: +// +// bits: name description +// 15-14 type mutex type, should be 3 +// +// pi_mutex holds the state of a PI mutex. +// +// For a Non-PI mutex, it includes below fields: +// Atomic(uint16_t) state; +// atomic_int owner_tid; // Atomic(uint16_t) in 32-bit programs +// +// state holds the following fields: +// +// bits: name description +// 15-14 type mutex type, can be 0 (normal), 1 (recursive), 2 (errorcheck) +// 13 shared process-shared flag +// 12-2 counter <number of times a thread holding a recursive Non-PI mutex> - 1 +// 1-0 state lock state (0, 1 or 2) +// +// bits 15-13 are constant during the lifetime of the mutex. +// +// owner_tid is used only in recursive and errorcheck Non-PI mutexes to hold the mutex owner +// thread id. +// +// PI mutexes and Non-PI mutexes are distinguished by checking type field in state. struct pthread_mutex_internal_t { _Atomic(uint16_t) state; #if defined(__LP64__) uint16_t __pad; - atomic_int owner_tid; - char __reserved[32]; + union { + atomic_int owner_tid; + PIMutex pi_mutex; + }; + char __reserved[28]; #else _Atomic(uint16_t) owner_tid; #endif @@ -267,13 +406,26 @@ int pthread_mutex_init(pthread_mutex_t* mutex_interface, const pthread_mutexattr return EINVAL; } - atomic_init(&mutex->state, state); - atomic_init(&mutex->owner_tid, 0); + if (((*attr & MUTEXATTR_PROTOCOL_MASK) >> MUTEXATTR_PROTOCOL_SHIFT) == PTHREAD_PRIO_INHERIT) { +#if defined(__LP64__) + atomic_init(&mutex->state, MUTEX_TYPE_BITS_WITH_PI); + mutex->pi_mutex.type = *attr & MUTEXATTR_TYPE_MASK; + mutex->pi_mutex.shared = (*attr & MUTEXATTR_SHARED_MASK) != 0; +#else + return EINVAL; +#endif + } else { + atomic_init(&mutex->state, state); + atomic_init(&mutex->owner_tid, 0); + } return 0; } -static inline __always_inline int __pthread_normal_mutex_trylock(pthread_mutex_internal_t* mutex, - uint16_t shared) { +// namespace for Non-PI mutex routines. +namespace NonPI { + +static inline __always_inline int NormalMutexTryLock(pthread_mutex_internal_t* mutex, + uint16_t shared) { const uint16_t unlocked = shared | MUTEX_STATE_BITS_UNLOCKED; const uint16_t locked_uncontended = shared | MUTEX_STATE_BITS_LOCKED_UNCONTENDED; @@ -286,7 +438,7 @@ static inline __always_inline int __pthread_normal_mutex_trylock(pthread_mutex_i } /* - * Lock a mutex of type NORMAL. + * Lock a normal Non-PI mutex. * * As noted above, there are three states: * 0 (unlocked, no contention) @@ -297,11 +449,11 @@ static inline __always_inline int __pthread_normal_mutex_trylock(pthread_mutex_i * "type" value is zero, so the only bits that will be set are the ones in * the lock state field. */ -static inline __always_inline int __pthread_normal_mutex_lock(pthread_mutex_internal_t* mutex, - uint16_t shared, - bool use_realtime_clock, - const timespec* abs_timeout_or_null) { - if (__predict_true(__pthread_normal_mutex_trylock(mutex, shared) == 0)) { +static inline __always_inline int NormalMutexLock(pthread_mutex_internal_t* mutex, + uint16_t shared, + bool use_realtime_clock, + const timespec* abs_timeout_or_null) { + if (__predict_true(NormalMutexTryLock(mutex, shared) == 0)) { return 0; } int result = check_timespec(abs_timeout_or_null, true); @@ -333,11 +485,11 @@ static inline __always_inline int __pthread_normal_mutex_lock(pthread_mutex_inte } /* - * Release a normal mutex. The caller is responsible for determining + * Release a normal Non-PI mutex. The caller is responsible for determining * that we are in fact the owner of this lock. */ -static inline __always_inline void __pthread_normal_mutex_unlock(pthread_mutex_internal_t* mutex, - uint16_t shared) { +static inline __always_inline void NormalMutexUnlock(pthread_mutex_internal_t* mutex, + uint16_t shared) { const uint16_t unlocked = shared | MUTEX_STATE_BITS_UNLOCKED; const uint16_t locked_contended = shared | MUTEX_STATE_BITS_LOCKED_CONTENDED; @@ -370,14 +522,14 @@ static inline __always_inline void __pthread_normal_mutex_unlock(pthread_mutex_i } } -/* This common inlined function is used to increment the counter of a recursive mutex. +/* This common inlined function is used to increment the counter of a recursive Non-PI mutex. * * If the counter overflows, it will return EAGAIN. * Otherwise, it atomically increments the counter and returns 0. * */ -static inline __always_inline int __recursive_increment(pthread_mutex_internal_t* mutex, - uint16_t old_state) { +static inline __always_inline int RecursiveIncrement(pthread_mutex_internal_t* mutex, + uint16_t old_state) { // Detect recursive lock overflow and return EAGAIN. // This is safe because only the owner thread can modify the // counter bits in the mutex value. @@ -387,17 +539,17 @@ static inline __always_inline int __recursive_increment(pthread_mutex_internal_t // Other threads are able to change the lower bits (e.g. promoting it to "contended"), // but the mutex counter will not overflow. So we use atomic_fetch_add operation here. - // The mutex is still locked by current thread, so we don't need a release fence. + // The mutex is already locked by current thread, so we don't need an acquire fence. atomic_fetch_add_explicit(&mutex->state, MUTEX_COUNTER_BITS_ONE, memory_order_relaxed); return 0; } -static inline __always_inline int __recursive_or_errorcheck_mutex_wait( - pthread_mutex_internal_t* mutex, - uint16_t shared, - uint16_t old_state, - bool use_realtime_clock, - const timespec* abs_timeout) { +// Wait on a recursive or errorcheck Non-PI mutex. +static inline __always_inline int RecursiveOrErrorcheckMutexWait(pthread_mutex_internal_t* mutex, + uint16_t shared, + uint16_t old_state, + bool use_realtime_clock, + const timespec* abs_timeout) { // __futex_wait always waits on a 32-bit value. But state is 16-bit. For a normal mutex, the owner_tid // field in mutex is not used. On 64-bit devices, the __pad field in mutex is not used. // But when a recursive or errorcheck mutex is used on 32-bit devices, we need to add the @@ -418,16 +570,16 @@ static inline __always_inline int __recursive_or_errorcheck_mutex_wait( #endif } -static int __pthread_mutex_lock_with_timeout(pthread_mutex_internal_t* mutex, - bool use_realtime_clock, - const timespec* abs_timeout_or_null) { +// Lock a Non-PI mutex. +static int MutexLockWithTimeout(pthread_mutex_internal_t* mutex, bool use_realtime_clock, + const timespec* abs_timeout_or_null) { uint16_t old_state = atomic_load_explicit(&mutex->state, memory_order_relaxed); uint16_t mtype = (old_state & MUTEX_TYPE_MASK); uint16_t shared = (old_state & MUTEX_SHARED_MASK); // Handle common case first. if ( __predict_true(mtype == MUTEX_TYPE_BITS_NORMAL) ) { - return __pthread_normal_mutex_lock(mutex, shared, use_realtime_clock, abs_timeout_or_null); + return NormalMutexLock(mutex, shared, use_realtime_clock, abs_timeout_or_null); } // Do we already own this recursive or error-check mutex? @@ -436,7 +588,7 @@ static int __pthread_mutex_lock_with_timeout(pthread_mutex_internal_t* mutex, if (mtype == MUTEX_TYPE_BITS_ERRORCHECK) { return EDEADLK; } - return __recursive_increment(mutex, old_state); + return RecursiveIncrement(mutex, old_state); } const uint16_t unlocked = mtype | shared | MUTEX_STATE_BITS_UNLOCKED; @@ -492,14 +644,16 @@ static int __pthread_mutex_lock_with_timeout(pthread_mutex_internal_t* mutex, return result; } // We are in locked_contended state, sleep until someone wakes us up. - if (__recursive_or_errorcheck_mutex_wait(mutex, shared, old_state, use_realtime_clock, - abs_timeout_or_null) == -ETIMEDOUT) { + if (RecursiveOrErrorcheckMutexWait(mutex, shared, old_state, use_realtime_clock, + abs_timeout_or_null) == -ETIMEDOUT) { return ETIMEDOUT; } old_state = atomic_load_explicit(&mutex->state, memory_order_relaxed); } } +} // namespace NonPI + int pthread_mutex_lock(pthread_mutex_t* mutex_interface) { #if !defined(__LP64__) // Some apps depend on being able to pass NULL as a mutex and get EINVAL @@ -517,11 +671,16 @@ int pthread_mutex_lock(pthread_mutex_t* mutex_interface) { uint16_t shared = (old_state & MUTEX_SHARED_MASK); // Avoid slowing down fast path of normal mutex lock operation. if (__predict_true(mtype == MUTEX_TYPE_BITS_NORMAL)) { - if (__predict_true(__pthread_normal_mutex_trylock(mutex, shared) == 0)) { + if (__predict_true(NonPI::NormalMutexTryLock(mutex, shared) == 0)) { return 0; } } - return __pthread_mutex_lock_with_timeout(mutex, false, nullptr); +#if defined(__LP64__) + if (mtype == MUTEX_TYPE_BITS_WITH_PI) { + return PIMutexTimedLock(mutex->pi_mutex, nullptr); + } +#endif + return NonPI::MutexLockWithTimeout(mutex, false, nullptr); } int pthread_mutex_unlock(pthread_mutex_t* mutex_interface) { @@ -542,9 +701,14 @@ int pthread_mutex_unlock(pthread_mutex_t* mutex_interface) { // Handle common case first. if (__predict_true(mtype == MUTEX_TYPE_BITS_NORMAL)) { - __pthread_normal_mutex_unlock(mutex, shared); + NonPI::NormalMutexUnlock(mutex, shared); return 0; } +#if defined(__LP64__) + if (mtype == MUTEX_TYPE_BITS_WITH_PI) { + return PIMutexUnlock(mutex->pi_mutex); + } +#endif // Do we already own this recursive or error-check mutex? pid_t tid = __get_thread()->tid; @@ -582,15 +746,17 @@ int pthread_mutex_trylock(pthread_mutex_t* mutex_interface) { uint16_t old_state = atomic_load_explicit(&mutex->state, memory_order_relaxed); uint16_t mtype = (old_state & MUTEX_TYPE_MASK); - uint16_t shared = (old_state & MUTEX_SHARED_MASK); - - const uint16_t unlocked = mtype | shared | MUTEX_STATE_BITS_UNLOCKED; - const uint16_t locked_uncontended = mtype | shared | MUTEX_STATE_BITS_LOCKED_UNCONTENDED; // Handle common case first. if (__predict_true(mtype == MUTEX_TYPE_BITS_NORMAL)) { - return __pthread_normal_mutex_trylock(mutex, shared); + uint16_t shared = (old_state & MUTEX_SHARED_MASK); + return NonPI::NormalMutexTryLock(mutex, shared); } +#if defined(__LP64__) + if (mtype == MUTEX_TYPE_BITS_WITH_PI) { + return PIMutexTryLock(mutex->pi_mutex); + } +#endif // Do we already own this recursive or error-check mutex? pid_t tid = __get_thread()->tid; @@ -598,9 +764,13 @@ int pthread_mutex_trylock(pthread_mutex_t* mutex_interface) { if (mtype == MUTEX_TYPE_BITS_ERRORCHECK) { return EBUSY; } - return __recursive_increment(mutex, old_state); + return NonPI::RecursiveIncrement(mutex, old_state); } + uint16_t shared = (old_state & MUTEX_SHARED_MASK); + const uint16_t unlocked = mtype | shared | MUTEX_STATE_BITS_UNLOCKED; + const uint16_t locked_uncontended = mtype | shared | MUTEX_STATE_BITS_LOCKED_UNCONTENDED; + // Same as pthread_mutex_lock, except that we don't want to wait, and // the only operation that can succeed is a single compare_exchange to acquire the // lock if it is released / not owned by anyone. No need for a complex loop. @@ -623,8 +793,8 @@ extern "C" int pthread_mutex_lock_timeout_np(pthread_mutex_t* mutex_interface, u timespec_from_ms(ts, ms); timespec abs_timeout; absolute_timespec_from_timespec(abs_timeout, ts, CLOCK_MONOTONIC); - int error = __pthread_mutex_lock_with_timeout(__get_internal_mutex(mutex_interface), - false, &abs_timeout); + int error = NonPI::MutexLockWithTimeout(__get_internal_mutex(mutex_interface), false, + &abs_timeout); if (error == ETIMEDOUT) { error = EBUSY; } @@ -633,13 +803,33 @@ extern "C" int pthread_mutex_lock_timeout_np(pthread_mutex_t* mutex_interface, u #endif int pthread_mutex_timedlock(pthread_mutex_t* mutex_interface, const timespec* abs_timeout) { - return __pthread_mutex_lock_with_timeout(__get_internal_mutex(mutex_interface), - true, abs_timeout); + pthread_mutex_internal_t* mutex = __get_internal_mutex(mutex_interface); + uint16_t old_state = atomic_load_explicit(&mutex->state, memory_order_relaxed); + uint16_t mtype = (old_state & MUTEX_TYPE_MASK); + // Handle common case first. + if (__predict_true(mtype == MUTEX_TYPE_BITS_NORMAL)) { + uint16_t shared = (old_state & MUTEX_SHARED_MASK); + if (__predict_true(NonPI::NormalMutexTryLock(mutex, shared) == 0)) { + return 0; + } + } +#if defined(__LP64__) + if (mtype == MUTEX_TYPE_BITS_WITH_PI) { + return PIMutexTimedLock(mutex->pi_mutex, abs_timeout); + } +#endif + return NonPI::MutexLockWithTimeout(mutex, true, abs_timeout); } int pthread_mutex_destroy(pthread_mutex_t* mutex_interface) { pthread_mutex_internal_t* mutex = __get_internal_mutex(mutex_interface); uint16_t old_state = atomic_load_explicit(&mutex->state, memory_order_relaxed); +#if defined(__LP64__) + uint16_t mtype = (old_state & MUTEX_TYPE_MASK); + if (mtype == MUTEX_TYPE_BITS_WITH_PI) { + return PIMutexDestroy(mutex->pi_mutex); + } +#endif // Store 0xffff to make the mutex unusable. Although POSIX standard says it is undefined // behavior to destroy a locked mutex, we prefer not to change mutex->state in that situation. if (MUTEX_STATE_BITS_IS_UNLOCKED(old_state) && diff --git a/libc/bionic/sigaddset.cpp b/libc/bionic/sigaddset.cpp deleted file mode 100644 index ca6b9821b..000000000 --- a/libc/bionic/sigaddset.cpp +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <errno.h> -#include <signal.h> - -int sigaddset(sigset_t* set, int signum) { - int bit = signum - 1; // Signal numbers start at 1, but bit positions start at 0. - unsigned long* local_set = reinterpret_cast<unsigned long*>(set); - if (set == NULL || bit < 0 || bit >= static_cast<int>(8*sizeof(sigset_t))) { - errno = EINVAL; - return -1; - } - local_set[bit / LONG_BIT] |= 1UL << (bit % LONG_BIT); - return 0; -} diff --git a/libc/bionic/sigblock.c b/libc/bionic/sigblock.c deleted file mode 100644 index 176bc1306..000000000 --- a/libc/bionic/sigblock.c +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ -#include <signal.h> - -/* this function is called from the ARM assembly setjmp fragments */ -int -sigblock(int mask) -{ - int n; - union { - int the_mask; - sigset_t the_sigset; - } in, out; - - sigemptyset(&in.the_sigset); - in.the_mask = mask; - - n = sigprocmask(SIG_BLOCK, &in.the_sigset, &out.the_sigset); - if (n) - return n; - - return out.the_mask; -} - - diff --git a/libc/bionic/sigdelset.cpp b/libc/bionic/sigdelset.cpp deleted file mode 100644 index 48363d336..000000000 --- a/libc/bionic/sigdelset.cpp +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <errno.h> -#include <signal.h> - -int sigdelset(sigset_t* set, int signum) { - int bit = signum - 1; // Signal numbers start at 1, but bit positions start at 0. - unsigned long* local_set = reinterpret_cast<unsigned long*>(set); - if (set == NULL || bit < 0 || bit >= static_cast<int>(8*sizeof(sigset_t))) { - errno = EINVAL; - return -1; - } - local_set[bit / LONG_BIT] &= ~(1UL << (bit % LONG_BIT)); - return 0; -} diff --git a/libc/bionic/sigemptyset.cpp b/libc/bionic/sigemptyset.cpp deleted file mode 100644 index 58166a1a9..000000000 --- a/libc/bionic/sigemptyset.cpp +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <errno.h> -#include <signal.h> -#include <string.h> - -int sigemptyset(sigset_t* set) { - if (set == NULL) { - errno = EINVAL; - return -1; - } - memset(set, 0, sizeof(sigset_t)); - return 0; -} diff --git a/libc/bionic/sigfillset.cpp b/libc/bionic/sigfillset.cpp deleted file mode 100644 index cb673942e..000000000 --- a/libc/bionic/sigfillset.cpp +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <errno.h> -#include <signal.h> -#include <string.h> - -int sigfillset(sigset_t* set) { - if (set == NULL) { - errno = EINVAL; - return -1; - } - memset(set, ~0, sizeof(sigset_t)); - return 0; -} diff --git a/libc/bionic/sighold.cpp b/libc/bionic/sighold.cpp deleted file mode 100644 index e9c8ca134..000000000 --- a/libc/bionic/sighold.cpp +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <signal.h> - -int sighold(int sig) { - sigset_t set; - if (sigemptyset(&set) == -1) return -1; - if (sigaddset(&set, sig) == -1) return -1; - return sigprocmask(SIG_BLOCK, &set, nullptr); -} diff --git a/libc/bionic/sigignore.cpp b/libc/bionic/sigignore.cpp deleted file mode 100644 index 06f458e4b..000000000 --- a/libc/bionic/sigignore.cpp +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <signal.h> -#include <string.h> - -int sigignore(int sig) { - struct sigaction sa; - memset(&sa, 0, sizeof(sa)); - if (sigemptyset(&sa.sa_mask) == -1) return -1; - sa.sa_handler = SIG_IGN; - return sigaction(sig, &sa, nullptr); -} diff --git a/libc/bionic/siginterrupt.c b/libc/bionic/siginterrupt.c deleted file mode 100644 index 4e91edb44..000000000 --- a/libc/bionic/siginterrupt.c +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <signal.h> - -/* this is only useful for legacy programs */ -int siginterrupt(int sig, int flag) -{ - struct sigaction act; - - (void) sigaction(sig, NULL, &act); - - if (flag) - act.sa_flags &= ~SA_RESTART; - else - act.sa_flags |= SA_RESTART; - - return sigaction(sig, &act, NULL); -} - diff --git a/libc/bionic/sigismember.cpp b/libc/bionic/sigismember.cpp deleted file mode 100644 index 9d1fc3c84..000000000 --- a/libc/bionic/sigismember.cpp +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <errno.h> -#include <signal.h> - -int sigismember(const sigset_t* set, int signum) { - int bit = signum - 1; // Signal numbers start at 1, but bit positions start at 0. - const unsigned long* local_set = reinterpret_cast<const unsigned long*>(set); - if (set == NULL || bit < 0 || bit >= static_cast<int>(8*sizeof(sigset_t))) { - errno = EINVAL; - return -1; - } - return static_cast<int>((local_set[bit / LONG_BIT] >> (bit % LONG_BIT)) & 1); -} diff --git a/libc/bionic/signal.cpp b/libc/bionic/signal.cpp index 13d188257..9a2341604 100644 --- a/libc/bionic/signal.cpp +++ b/libc/bionic/signal.cpp @@ -26,7 +26,108 @@ * SUCH DAMAGE. */ +#include <errno.h> +#include <pthread.h> #include <signal.h> +#include <string.h> +#include <sys/types.h> +#include <time.h> +#include <unistd.h> + +#include "private/kernel_sigset_t.h" + +extern "C" int ___rt_sigqueueinfo(pid_t, int, siginfo_t*); +extern "C" int __rt_sigtimedwait(const sigset_t*, siginfo_t*, const timespec*, size_t); + +int sigaddset(sigset_t* set, int signum) { + int bit = signum - 1; // Signal numbers start at 1, but bit positions start at 0. + unsigned long* local_set = reinterpret_cast<unsigned long*>(set); + if (set == NULL || bit < 0 || bit >= static_cast<int>(8*sizeof(sigset_t))) { + errno = EINVAL; + return -1; + } + local_set[bit / LONG_BIT] |= 1UL << (bit % LONG_BIT); + return 0; +} + +// This isn't in our header files, but is exposed on all architectures. +extern "C" int sigblock(int mask) { + union { + int mask; + sigset_t set; + } in, out; + + sigemptyset(&in.set); + in.mask = mask; + + if (sigprocmask(SIG_BLOCK, &in.set, &out.set) == -1) return -1; + return out.mask; +} + +int sigdelset(sigset_t* set, int signum) { + int bit = signum - 1; // Signal numbers start at 1, but bit positions start at 0. + unsigned long* local_set = reinterpret_cast<unsigned long*>(set); + if (set == NULL || bit < 0 || bit >= static_cast<int>(8*sizeof(sigset_t))) { + errno = EINVAL; + return -1; + } + local_set[bit / LONG_BIT] &= ~(1UL << (bit % LONG_BIT)); + return 0; +} + +int sigemptyset(sigset_t* set) { + if (set == NULL) { + errno = EINVAL; + return -1; + } + memset(set, 0, sizeof(sigset_t)); + return 0; +} + +int sigfillset(sigset_t* set) { + if (set == NULL) { + errno = EINVAL; + return -1; + } + memset(set, ~0, sizeof(sigset_t)); + return 0; +} + +int sighold(int sig) { + kernel_sigset_t set; + set.clear(); + if (!set.set(sig)) return -1; + return __rt_sigprocmask(SIG_BLOCK, &set, nullptr, sizeof(set)); +} + +int sigignore(int sig) { + struct sigaction sa; + memset(&sa, 0, sizeof(sa)); + if (sigemptyset(&sa.sa_mask) == -1) return -1; + sa.sa_handler = SIG_IGN; + return sigaction(sig, &sa, nullptr); +} + +int siginterrupt(int sig, int flag) { + struct sigaction act; + sigaction(sig, nullptr, &act); + if (flag) { + act.sa_flags &= ~SA_RESTART; + } else { + act.sa_flags |= SA_RESTART; + } + return sigaction(sig, &act, nullptr); +} + +int sigismember(const sigset_t* set, int signum) { + int bit = signum - 1; // Signal numbers start at 1, but bit positions start at 0. + const unsigned long* local_set = reinterpret_cast<const unsigned long*>(set); + if (set == NULL || bit < 0 || bit >= static_cast<int>(8*sizeof(sigset_t))) { + errno = EINVAL; + return -1; + } + return static_cast<int>((local_set[bit / LONG_BIT] >> (bit % LONG_BIT)) & 1); +} __LIBC_HIDDEN__ sighandler_t _signal(int signum, sighandler_t handler, int flags) { struct sigaction sa; @@ -44,3 +145,127 @@ __LIBC_HIDDEN__ sighandler_t _signal(int signum, sighandler_t handler, int flags sighandler_t signal(int signum, sighandler_t handler) { return _signal(signum, handler, SA_RESTART); } + +int sigpause(int sig) { + kernel_sigset_t set; + set.clear(); + if (__rt_sigprocmask(SIG_SETMASK, nullptr, &set, sizeof(set)) == -1) return -1; + if (!set.clear(sig)) return -1; + return __rt_sigsuspend(&set, sizeof(set)); +} + +int sigpending(sigset_t* bionic_set) { + kernel_sigset_t set; + int result = __rt_sigpending(&set, sizeof(set)); + if (result != -1) { + *bionic_set = set.bionic; + } + return result; +} + +int sigprocmask(int how, const sigset_t* bionic_new_set, sigset_t* bionic_old_set) { + kernel_sigset_t new_set; + kernel_sigset_t* new_set_ptr = NULL; + if (bionic_new_set != NULL) { + new_set.set(bionic_new_set); + new_set_ptr = &new_set; + } + + kernel_sigset_t old_set; + if (__rt_sigprocmask(how, new_set_ptr, &old_set, sizeof(old_set)) == -1) { + return -1; + } + + if (bionic_old_set != NULL) { + *bionic_old_set = old_set.bionic; + } + + return 0; +} + +int sigqueue(pid_t pid, int signo, const sigval value) { + siginfo_t info; + memset(&info, 0, sizeof(siginfo_t)); + info.si_signo = signo; + info.si_code = SI_QUEUE; + info.si_pid = getpid(); + info.si_uid = getuid(); + info.si_value = value; + + return ___rt_sigqueueinfo(pid, signo, &info); +} + +int sigrelse(int sig) { + kernel_sigset_t set; + set.clear(); + if (!set.set(sig)) return -1; + return __rt_sigprocmask(SIG_UNBLOCK, &set, nullptr, sizeof(set)); +} + +sighandler_t sigset(int sig, sighandler_t disp) { + struct sigaction new_sa; + if (disp != SIG_HOLD) { + memset(&new_sa, 0, sizeof(new_sa)); + new_sa.sa_handler = disp; + sigemptyset(&new_sa.sa_mask); + } + + struct sigaction old_sa; + if (sigaction(sig, (disp == SIG_HOLD) ? nullptr : &new_sa, &old_sa) == -1) { + return SIG_ERR; + } + + kernel_sigset_t new_mask{sig}; + kernel_sigset_t old_mask; + if (__rt_sigprocmask(disp == SIG_HOLD ? SIG_BLOCK : SIG_UNBLOCK, &new_mask, &old_mask, + sizeof(new_mask)) == -1) { + return SIG_ERR; + } + + return old_mask.is_set(sig) ? SIG_HOLD : old_sa.sa_handler; +} + +// This isn't in our header files, but is exposed on all architectures. +extern "C" int sigsetmask(int mask) { + union { + int mask; + sigset_t set; + } in, out; + + sigemptyset(&in.set); + in.mask = mask; + + if (sigprocmask(SIG_SETMASK, &in.set, &out.set) == -1) return -1; + return out.mask; +} + +int sigsuspend(const sigset_t* bionic_set) { + kernel_sigset_t set(bionic_set); + return __rt_sigsuspend(&set, sizeof(set)); +} + +int sigtimedwait(const sigset_t* set, siginfo_t* info, const timespec* timeout) { + kernel_sigset_t sigset(set); + return __rt_sigtimedwait(sigset.get(), info, timeout, sizeof(sigset)); +} + +int sigwait(const sigset_t* set, int* sig) { + kernel_sigset_t sigset(set); + while (true) { + // __rt_sigtimedwait can return EAGAIN or EINTR, we need to loop + // around them since sigwait is only allowed to return EINVAL. + int result = __rt_sigtimedwait(sigset.get(), NULL, NULL, sizeof(sigset)); + if (result >= 0) { + *sig = result; + return 0; + } + + if (errno != EAGAIN && errno != EINTR) { + return errno; + } + } +} + +int sigwaitinfo(const sigset_t* set, siginfo_t* info) { + return sigtimedwait(set, info, NULL); +} diff --git a/libc/bionic/sigpause.cpp b/libc/bionic/sigpause.cpp deleted file mode 100644 index 8ba42d43c..000000000 --- a/libc/bionic/sigpause.cpp +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <signal.h> - -int sigpause(int sig) { - sigset_t set; - if (sigprocmask(SIG_SETMASK, nullptr, &set) == -1) return -1; - if (sigdelset(&set, sig) == -1) return -1; - return sigsuspend(&set); -} diff --git a/libc/bionic/sigpending.cpp b/libc/bionic/sigpending.cpp deleted file mode 100644 index b6e503c56..000000000 --- a/libc/bionic/sigpending.cpp +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <signal.h> - -#include "private/kernel_sigset_t.h" - -extern "C" int __rt_sigpending(const kernel_sigset_t*, size_t); - -int sigpending(sigset_t* bionic_set) { - kernel_sigset_t set; - int result = __rt_sigpending(&set, sizeof(set)); - if (result != -1) { - *bionic_set = set.bionic; - } - return result; -} diff --git a/libc/bionic/sigprocmask.cpp b/libc/bionic/sigprocmask.cpp deleted file mode 100644 index 61e2c633a..000000000 --- a/libc/bionic/sigprocmask.cpp +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <errno.h> -#include <pthread.h> -#include <signal.h> - -#include "private/kernel_sigset_t.h" - -extern "C" int __rt_sigprocmask(int, const kernel_sigset_t*, kernel_sigset_t*, size_t); - -int sigprocmask(int how, const sigset_t* bionic_new_set, sigset_t* bionic_old_set) { - kernel_sigset_t new_set; - kernel_sigset_t* new_set_ptr = NULL; - if (bionic_new_set != NULL) { - new_set.set(bionic_new_set); - new_set_ptr = &new_set; - } - - kernel_sigset_t old_set; - if (__rt_sigprocmask(how, new_set_ptr, &old_set, sizeof(old_set)) == -1) { - return -1; - } - - if (bionic_old_set != NULL) { - *bionic_old_set = old_set.bionic; - } - - return 0; -} diff --git a/libc/bionic/sigqueue.cpp b/libc/bionic/sigqueue.cpp deleted file mode 100644 index 8741460c4..000000000 --- a/libc/bionic/sigqueue.cpp +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (C) 2014 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <signal.h> -#include <string.h> -#include <sys/types.h> -#include <unistd.h> - -extern "C" int ___rt_sigqueueinfo(pid_t, int, siginfo_t*); - -int sigqueue(pid_t pid, int signo, const sigval value) { - siginfo_t info; - memset(&info, 0, sizeof(siginfo_t)); - info.si_signo = signo; - info.si_code = SI_QUEUE; - info.si_pid = getpid(); - info.si_uid = getuid(); - info.si_value = value; - - return ___rt_sigqueueinfo(pid, signo, &info); -} diff --git a/libc/bionic/sigrelse.cpp b/libc/bionic/sigrelse.cpp deleted file mode 100644 index ab5554eed..000000000 --- a/libc/bionic/sigrelse.cpp +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <signal.h> - -int sigrelse(int sig) { - sigset_t set; - if (sigemptyset(&set) == -1) return -1; - if (sigaddset(&set, sig) == -1) return -1; - return sigprocmask(SIG_UNBLOCK, &set, nullptr); -} diff --git a/libc/bionic/sigset.cpp b/libc/bionic/sigset.cpp deleted file mode 100644 index e3f3e7226..000000000 --- a/libc/bionic/sigset.cpp +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <signal.h> -#include <string.h> - -sighandler_t sigset(int sig, sighandler_t disp) { - struct sigaction new_sa; - if (disp != SIG_HOLD) { - memset(&new_sa, 0, sizeof(new_sa)); - new_sa.sa_handler = disp; - sigemptyset(&new_sa.sa_mask); - } - - struct sigaction old_sa; - if (sigaction(sig, disp == SIG_HOLD ? nullptr : &new_sa, &old_sa) == -1) { - return SIG_ERR; - } - - sigset_t new_proc_mask; - sigemptyset(&new_proc_mask); - sigaddset(&new_proc_mask, sig); - - sigset_t old_proc_mask; - if (sigprocmask(disp == SIG_HOLD ? SIG_BLOCK : SIG_UNBLOCK, - &new_proc_mask, &old_proc_mask) == -1) { - return SIG_ERR; - } - - return sigismember(&old_proc_mask, sig) ? SIG_HOLD : old_sa.sa_handler; -} diff --git a/libc/bionic/sigsetmask.c b/libc/bionic/sigsetmask.c deleted file mode 100644 index 7842bf14b..000000000 --- a/libc/bionic/sigsetmask.c +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ -#include <signal.h> - -/* called from setjmp assembly fragment */ -int -sigsetmask(int mask) -{ - int n; - - union { - int the_mask; - sigset_t the_sigset; - } in, out; - - sigemptyset(&in.the_sigset); - in.the_mask = mask; - - n = sigprocmask(SIG_SETMASK, &in.the_sigset, &out.the_sigset); - if (n) - return n; - - return out.the_mask; -} - diff --git a/libc/bionic/sigsuspend.cpp b/libc/bionic/sigsuspend.cpp deleted file mode 100644 index fb846b83e..000000000 --- a/libc/bionic/sigsuspend.cpp +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <signal.h> - -#include "private/kernel_sigset_t.h" - -extern "C" int __rt_sigsuspend(const kernel_sigset_t*, size_t); - -int sigsuspend(const sigset_t* bionic_set) { - kernel_sigset_t set(bionic_set); - return __rt_sigsuspend(&set, sizeof(set)); -} diff --git a/libc/bionic/sigtimedwait.cpp b/libc/bionic/sigtimedwait.cpp deleted file mode 100644 index c29f806e9..000000000 --- a/libc/bionic/sigtimedwait.cpp +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2014 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <signal.h> - -#include "private/kernel_sigset_t.h" - -extern "C" int __rt_sigtimedwait(const sigset_t*, siginfo_t*, const timespec*, size_t); - -int sigtimedwait(const sigset_t* set, siginfo_t* info, const timespec* timeout) { - kernel_sigset_t sigset(set); - return __rt_sigtimedwait(sigset.get(), info, timeout, sizeof(sigset)); -} diff --git a/libc/bionic/sigwaitinfo.cpp b/libc/bionic/sigwaitinfo.cpp deleted file mode 100644 index 43e2395e6..000000000 --- a/libc/bionic/sigwaitinfo.cpp +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (C) 2014 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <signal.h> - -int sigwaitinfo(const sigset_t* set, siginfo_t* info) { - return sigtimedwait(set, info, NULL); -} diff --git a/libc/bionic/signalfd.cpp b/libc/bionic/sys_signalfd.cpp index 63e1db431..63e1db431 100644 --- a/libc/bionic/signalfd.cpp +++ b/libc/bionic/sys_signalfd.cpp diff --git a/libc/include/android/dlext.h b/libc/include/android/dlext.h index c824544a2..2b4169e53 100644 --- a/libc/include/android/dlext.h +++ b/libc/include/android/dlext.h @@ -23,88 +23,116 @@ #include <sys/cdefs.h> #include <sys/types.h> /* for off64_t */ +/** + * \file + * Advanced dynamic library opening support. Most users will want to use + * the standard [dlopen(3)](http://man7.org/linux/man-pages/man3/dlopen.3.html) + * functionality in `<dlfcn.h>` instead. + */ + __BEGIN_DECLS -/* bitfield definitions for android_dlextinfo.flags */ +/** Bitfield definitions for `android_dlextinfo::flags`. */ enum { - /* When set, the reserved_addr and reserved_size fields must point to an + /** + * When set, the `reserved_addr` and `reserved_size` fields must point to an * already-reserved region of address space which will be used to load the - * library if it fits. If the reserved region is not large enough, the load - * will fail. + * library if it fits. + * + * If the reserved region is not large enough, loading will fail. */ ANDROID_DLEXT_RESERVED_ADDRESS = 0x1, - /* As DLEXT_RESERVED_ADDRESS, but if the reserved region is not large enough, + /** + * Like `ANDROID_DLEXT_RESERVED_ADDRESS`, but if the reserved region is not large enough, * the linker will choose an available address instead. */ ANDROID_DLEXT_RESERVED_ADDRESS_HINT = 0x2, - /* When set, write the GNU RELRO section of the mapped library to relro_fd + /** + * When set, write the GNU RELRO section of the mapped library to `relro_fd` * after relocation has been performed, to allow it to be reused by another * process loading the same library at the same address. This implies - * ANDROID_DLEXT_USE_RELRO. + * `ANDROID_DLEXT_USE_RELRO`. + * + * This is mainly useful for the system WebView implementation. */ ANDROID_DLEXT_WRITE_RELRO = 0x4, - /* When set, compare the GNU RELRO section of the mapped library to relro_fd + /** + * When set, compare the GNU RELRO section of the mapped library to `relro_fd` * after relocation has been performed, and replace any relocated pages that * are identical with a version mapped from the file. + * + * This is mainly useful for the system WebView implementation. */ ANDROID_DLEXT_USE_RELRO = 0x8, - /* Instruct dlopen to use library_fd instead of opening file by name. + /** + * Use `library_fd` instead of opening the file by name. * The filename parameter is still used to identify the library. */ ANDROID_DLEXT_USE_LIBRARY_FD = 0x10, - /* If opening a library using library_fd read it starting at library_fd_offset. - * This flag is only valid when ANDROID_DLEXT_USE_LIBRARY_FD is set. + /** + * If opening a library using `library_fd` read it starting at `library_fd_offset`. + * This is mainly useful for loading a library stored within another file (such as uncompressed + * inside a ZIP archive). + * This flag is only valid when `ANDROID_DLEXT_USE_LIBRARY_FD` is set. */ ANDROID_DLEXT_USE_LIBRARY_FD_OFFSET = 0x20, - /* When set, do not check if the library has already been loaded by file stat(2)s. + /** + * When set, do not use `stat(2)` to check if the library has already been loaded. * * This flag allows forced loading of the library in the case when for some * reason multiple ELF files share the same filename (because the already-loaded * library has been removed and overwritten, for example). * - * Note that if the library has the same dt_soname as an old one and some other - * library has the soname in DT_NEEDED list, the first one will be used to resolve any + * Note that if the library has the same `DT_SONAME` as an old one and some other + * library has the soname in its `DT_NEEDED` list, the first one will be used to resolve any * dependencies. */ ANDROID_DLEXT_FORCE_LOAD = 0x40, - /* When set, if the minimum p_vaddr of the ELF file's PT_LOAD segments is non-zero, + /** + * When set, if the minimum `p_vaddr` of the ELF file's `PT_LOAD` segments is non-zero, * the dynamic linker will load it at that address. * * This flag is for ART internal use only. */ ANDROID_DLEXT_FORCE_FIXED_VADDR = 0x80, - /* Instructs dlopen to load the library at the address specified by reserved_addr. + /** + * Instructs dlopen to load the library at the address specified by reserved_addr. * - * The difference between ANDROID_DLEXT_LOAD_AT_FIXED_ADDRESS and ANDROID_DLEXT_RESERVED_ADDRESS - * is that for ANDROID_DLEXT_LOAD_AT_FIXED_ADDRESS the linker reserves memory at reserved_addr - * whereas for ANDROID_DLEXT_RESERVED_ADDRESS the linker relies on the caller to reserve the memory. + * The difference between `ANDROID_DLEXT_LOAD_AT_FIXED_ADDRESS` and + * `ANDROID_DLEXT_RESERVED_ADDRESS` is that for `ANDROID_DLEXT_LOAD_AT_FIXED_ADDRESS` the linker + * reserves memory at `reserved_addr` whereas for `ANDROID_DLEXT_RESERVED_ADDRESS` the linker + * relies on the caller to reserve the memory. * - * This flag can be used with ANDROID_DLEXT_FORCE_FIXED_VADDR; when ANDROID_DLEXT_FORCE_FIXED_VADDR - * is set and load_bias is not 0 (load_bias is min(p_vaddr) of PT_LOAD segments) this flag is ignored. - * This is implemented this way because the linker has to pick one address over the other and this - * way is more convenient for art. Note that ANDROID_DLEXT_FORCE_FIXED_VADDR does not generate - * an error when min(p_vaddr) is 0. + * This flag can be used with `ANDROID_DLEXT_FORCE_FIXED_VADDR`. When + * `ANDROID_DLEXT_FORCE_FIXED_VADDR` is set and `load_bias` is not 0 (`load_bias` is the + * minimum `p_vaddr` of all `PT_LOAD` segments) this flag is ignored because the linker has to + * pick one address over the other and this way is more convenient for ART. + * Note that `ANDROID_DLEXT_FORCE_FIXED_VADDR` does not generate an error when the minimum + * `p_vaddr` is 0. * - * Cannot be used with ANDROID_DLEXT_RESERVED_ADDRESS or ANDROID_DLEXT_RESERVED_ADDRESS_HINT. + * Cannot be used with `ANDROID_DLEXT_RESERVED_ADDRESS` or `ANDROID_DLEXT_RESERVED_ADDRESS_HINT`. * * This flag is for ART internal use only. */ ANDROID_DLEXT_LOAD_AT_FIXED_ADDRESS = 0x100, - /* This flag used to load library in a different namespace. The namespace is - * specified in library_namespace. + /** + * This flag used to load library in a different namespace. The namespace is + * specified in `library_namespace`. + * + * This flag is for internal use only (since there is no NDK API for namespaces). */ ANDROID_DLEXT_USE_NAMESPACE = 0x200, - /* Mask of valid bits */ + /** Mask of valid bits. */ ANDROID_DLEXT_VALID_FLAG_BITS = ANDROID_DLEXT_RESERVED_ADDRESS | ANDROID_DLEXT_RESERVED_ADDRESS_HINT | ANDROID_DLEXT_WRITE_RELRO | @@ -119,19 +147,36 @@ enum { struct android_namespace_t; +/** Used to pass Android-specific arguments to `android_dlopen_ext`. */ typedef struct { + /** A bitmask of `ANDROID_DLEXT_` enum values. */ uint64_t flags; + + /** Used by `ANDROID_DLEXT_RESERVED_ADDRESS` and `ANDROID_DLEXT_RESERVED_ADDRESS_HINT`. */ void* reserved_addr; + /** Used by `ANDROID_DLEXT_RESERVED_ADDRESS` and `ANDROID_DLEXT_RESERVED_ADDRESS_HINT`. */ size_t reserved_size; + + /** Used by `ANDROID_DLEXT_WRITE_RELRO` and `ANDROID_DLEXT_USE_RELRO`. */ int relro_fd; + + /** Used by `ANDROID_DLEXT_USE_LIBRARY_FD`. */ int library_fd; + /** Used by `ANDROID_DLEXT_USE_LIBRARY_FD_OFFSET` */ off64_t library_fd_offset; + + /** Used by `ANDROID_DLEXT_USE_NAMESPACE`. */ struct android_namespace_t* library_namespace; } android_dlextinfo; +/** + * Opens the given library. The `__filename` and `__flags` arguments are + * the same as for [dlopen(3)](http://man7.org/linux/man-pages/man3/dlopen.3.html), + * with the Android-specific flags supplied via the `flags` member of `__info`. + */ void* android_dlopen_ext(const char* __filename, int __flags, const android_dlextinfo* __info) __INTRODUCED_IN(21); __END_DECLS -#endif /* __ANDROID_DLEXT_H__ */ +#endif diff --git a/libc/include/android/legacy_errno_inlines.h b/libc/include/android/legacy_errno_inlines.h index 8f08074f1..9f116faea 100644 --- a/libc/include/android/legacy_errno_inlines.h +++ b/libc/include/android/legacy_errno_inlines.h @@ -29,11 +29,12 @@ #ifndef _ANDROID_LEGACY_ERRNO_INLINES_H #define _ANDROID_LEGACY_ERRNO_INLINES_H -#include <errno.h> #include <sys/cdefs.h> #if __ANDROID_API__ < __ANDROID_API_L__ +#include <errno.h> + __BEGIN_DECLS static __inline int __attribute__((deprecated)) __set_errno(int n) { diff --git a/libc/include/android/legacy_fenv_inlines_arm.h b/libc/include/android/legacy_fenv_inlines_arm.h index de024cf3c..6f2c9599c 100644 --- a/libc/include/android/legacy_fenv_inlines_arm.h +++ b/libc/include/android/legacy_fenv_inlines_arm.h @@ -29,10 +29,12 @@ #ifndef ANDROID_LEGACY_FENV_INLINES_ARM_H #define ANDROID_LEGACY_FENV_INLINES_ARM_H -#include <fenv.h> +#include <sys/cdefs.h> #if __ANDROID_API__ < __ANDROID_API_L__ && defined(__arm__) +#include <fenv.h> + __BEGIN_DECLS #define FPSCR_RMODE_SHIFT 22 diff --git a/libc/include/android/legacy_fenv_inlines_mips.h b/libc/include/android/legacy_fenv_inlines_mips.h index 10b93c070..43ad360d1 100644 --- a/libc/include/android/legacy_fenv_inlines_mips.h +++ b/libc/include/android/legacy_fenv_inlines_mips.h @@ -29,10 +29,12 @@ #ifndef ANDROID_LEGACY_FENV_INLINES_MIPS_H #define ANDROID_LEGACY_FENV_INLINES_MIPS_H -#include <fenv.h> +#include <sys/cdefs.h> #if __ANDROID_API__ < __ANDROID_API_L__ && (defined(__mips__) && !defined(__LP64__)) +#include <fenv.h> + __BEGIN_DECLS #define FCSR_CAUSE_SHIFT 10 diff --git a/libc/include/android/legacy_signal_inlines.h b/libc/include/android/legacy_signal_inlines.h index 4d474b093..44c2f4f63 100644 --- a/libc/include/android/legacy_signal_inlines.h +++ b/libc/include/android/legacy_signal_inlines.h @@ -29,16 +29,16 @@ #ifndef _ANDROID_LEGACY_SIGNAL_INLINES_H_ #define _ANDROID_LEGACY_SIGNAL_INLINES_H_ +#include <sys/cdefs.h> + +#if __ANDROID_API__ < __ANDROID_API_L__ + #include <errno.h> #include <signal.h> #include <string.h> -#include <sys/cdefs.h> - __BEGIN_DECLS -#if __ANDROID_API__ < __ANDROID_API_L__ - sighandler_t bsd_signal(int __signal, sighandler_t __handler) __REMOVED_IN(21); /* These weren't introduced until L. */ @@ -117,8 +117,8 @@ static __inline sighandler_t signal(int s, sighandler_t f) { return bsd_signal(s, f); } -#endif /* __ANDROID_API__ < __ANDROID_API_L__ */ - __END_DECLS +#endif /* __ANDROID_API__ < __ANDROID_API_L__ */ + #endif /* _ANDROID_LEGACY_SIGNAL_INLINES_H_ */ diff --git a/libc/include/android/legacy_stdlib_inlines.h b/libc/include/android/legacy_stdlib_inlines.h index a1cc590ef..4896d2e77 100644 --- a/libc/include/android/legacy_stdlib_inlines.h +++ b/libc/include/android/legacy_stdlib_inlines.h @@ -29,9 +29,6 @@ #ifndef _ANDROID_LEGACY_STDLIB_INLINES_H_ #define _ANDROID_LEGACY_STDLIB_INLINES_H_ -#include <errno.h> -#include <float.h> -#include <stdlib.h> #include <sys/cdefs.h> #if __ANDROID_API__ < __ANDROID_API_K__ @@ -52,6 +49,10 @@ __END_DECLS #if __ANDROID_API__ < __ANDROID_API_L__ +#include <errno.h> +#include <float.h> +#include <stdlib.h> + __BEGIN_DECLS static __inline float strtof(const char* nptr, char** endptr) { diff --git a/libc/include/android/legacy_strings_inlines.h b/libc/include/android/legacy_strings_inlines.h index 6679c3047..5d63c5a31 100644 --- a/libc/include/android/legacy_strings_inlines.h +++ b/libc/include/android/legacy_strings_inlines.h @@ -29,16 +29,19 @@ #ifndef _ANDROID_LEGACY_STRINGS_INLINES_H_ #define _ANDROID_LEGACY_STRINGS_INLINES_H_ -#include <strings.h> #include <sys/cdefs.h> +#if defined(__i386__) && __ANDROID_API__ < __ANDROID_API_J_MR2__ + +#include <strings.h> + __BEGIN_DECLS -#if defined(__i386__) && __ANDROID_API__ < __ANDROID_API_J_MR2__ /* Everyone except x86 had ffs since the beginning. */ static __inline int ffs(int __n) { return __builtin_ffs(__n); } -#endif __END_DECLS #endif + +#endif diff --git a/libc/include/android/legacy_sys_mman_inlines.h b/libc/include/android/legacy_sys_mman_inlines.h index 7eb537e7e..160e6fe60 100644 --- a/libc/include/android/legacy_sys_mman_inlines.h +++ b/libc/include/android/legacy_sys_mman_inlines.h @@ -29,12 +29,13 @@ #pragma once #include <sys/cdefs.h> -#include <sys/mman.h> -#include <sys/syscall.h> -#include <unistd.h> #if __ANDROID_API__ < __ANDROID_API_L__ +#include <errno.h> +#include <sys/mman.h> +#include <unistd.h> + __BEGIN_DECLS /* diff --git a/libc/include/android/legacy_sys_stat_inlines.h b/libc/include/android/legacy_sys_stat_inlines.h index bbf54c064..95216942b 100644 --- a/libc/include/android/legacy_sys_stat_inlines.h +++ b/libc/include/android/legacy_sys_stat_inlines.h @@ -30,10 +30,11 @@ #define _ANDROID_LEGACY_SYS_STAT_INLINES_H_ #include <sys/cdefs.h> -#include <sys/stat.h> #if __ANDROID_API__ < __ANDROID_API_L__ +#include <sys/stat.h> + __BEGIN_DECLS static __inline int mkfifo(const char* __path, mode_t __mode) { diff --git a/libc/include/android/legacy_sys_wait_inlines.h b/libc/include/android/legacy_sys_wait_inlines.h index 1124f8e29..4298d767b 100644 --- a/libc/include/android/legacy_sys_wait_inlines.h +++ b/libc/include/android/legacy_sys_wait_inlines.h @@ -30,12 +30,13 @@ #define _ANDROID_LEGACY_SYS_WAIT_INLINES_H_ #include <sys/cdefs.h> + +#if __ANDROID_API__ < __ANDROID_API_J_MR2__ + #include <sys/syscall.h> #include <sys/wait.h> #include <unistd.h> -#if __ANDROID_API__ < __ANDROID_API_J_MR2__ - __BEGIN_DECLS static __inline pid_t wait4(pid_t pid, int* status, int options, struct rusage* rusage) { diff --git a/libc/include/android/legacy_termios_inlines.h b/libc/include/android/legacy_termios_inlines.h index 4ed56f049..a63dba194 100644 --- a/libc/include/android/legacy_termios_inlines.h +++ b/libc/include/android/legacy_termios_inlines.h @@ -30,14 +30,16 @@ #define _ANDROID_LEGACY_TERMIOS_INLINES_H_ #include <sys/cdefs.h> -#include <sys/ioctl.h> -#include <sys/types.h> + +#if __ANDROID_API__ < __ANDROID_API_L__ #include <linux/termios.h> +#include <sys/ioctl.h> +#include <sys/types.h> -#if __ANDROID_API__ < __ANDROID_API_L__ #define __BIONIC_TERMIOS_INLINE static __inline #include <bits/termios_inlines.h> + #endif #endif /* _ANDROID_LEGACY_TERMIOS_INLINES_H_ */ diff --git a/libc/include/bits/fortify/fcntl.h b/libc/include/bits/fortify/fcntl.h index 6d90341c1..75cd4f2ed 100644 --- a/libc/include/bits/fortify/fcntl.h +++ b/libc/include/bits/fortify/fcntl.h @@ -98,7 +98,7 @@ __errordecl(__creat_missing_mode, __open_too_few_args_error); __errordecl(__creat_too_many_args, __open_too_many_args_error); #if __ANDROID_API__ >= __ANDROID_API_J_MR1__ -__BIONIC_FORTIFY_INLINE +__BIONIC_FORTIFY_VARIADIC int open(const char* pathname, int flags, ...) { if (__builtin_constant_p(flags)) { if (__open_modes_useful(flags) && __builtin_va_arg_pack_len() == 0) { @@ -117,7 +117,7 @@ int open(const char* pathname, int flags, ...) { return __open_real(pathname, flags, __builtin_va_arg_pack()); } -__BIONIC_FORTIFY_INLINE +__BIONIC_FORTIFY_VARIADIC int openat(int dirfd, const char* pathname, int flags, ...) { if (__builtin_constant_p(flags)) { if (__open_modes_useful(flags) && __builtin_va_arg_pack_len() == 0) { diff --git a/libc/include/bits/fortify/stdio.h b/libc/include/bits/fortify/stdio.h index cfc78d7af..6a6b43390 100644 --- a/libc/include/bits/fortify/stdio.h +++ b/libc/include/bits/fortify/stdio.h @@ -63,8 +63,7 @@ int snprintf(char* dest, size_t size, const char* format) "format string will always overflow destination buffer") __errorattr("format string will always overflow destination buffer"); -__BIONIC_FORTIFY_INLINE -__printflike(3, 4) +__BIONIC_FORTIFY_VARIADIC __printflike(3, 4) int snprintf(char* const __pass_object_size dest, size_t size, const char* format, ...) __overloadable { va_list va; @@ -82,8 +81,7 @@ int sprintf(char* dest, const char* format) "format string will always overflow destination buffer") __errorattr("format string will always overflow destination buffer"); -__BIONIC_FORTIFY_INLINE -__printflike(2, 3) +__BIONIC_FORTIFY_VARIADIC __printflike(2, 3) int sprintf(char* const __pass_object_size dest, const char* format, ...) __overloadable { va_list va; va_start(va, format); @@ -159,12 +157,12 @@ __errordecl(__fwrite_overflow, "fwrite called with overflowing size * count"); #if __ANDROID_API__ >= __ANDROID_API_J_MR1__ -__BIONIC_FORTIFY_INLINE __printflike(3, 4) +__BIONIC_FORTIFY_VARIADIC __printflike(3, 4) int snprintf(char* dest, size_t size, const char* format, ...) { return __builtin___snprintf_chk(dest, size, 0, __bos(dest), format, __builtin_va_arg_pack()); } -__BIONIC_FORTIFY_INLINE __printflike(2, 3) +__BIONIC_FORTIFY_VARIADIC __printflike(2, 3) int sprintf(char* dest, const char* format, ...) { return __builtin___sprintf_chk(dest, 0, __bos(dest), format, __builtin_va_arg_pack()); } diff --git a/libc/include/dirent.h b/libc/include/dirent.h index 7ac4ab736..d6819f2e1 100644 --- a/libc/include/dirent.h +++ b/libc/include/dirent.h @@ -80,8 +80,8 @@ DIR* opendir(const char* __path); DIR* fdopendir(int __dir_fd); struct dirent* readdir(DIR* __dir); struct dirent64* readdir64(DIR* __dir) __INTRODUCED_IN(21); -int readdir_r(DIR* __dir, struct dirent* __entry, struct dirent** __buffer); -int readdir64_r(DIR* __dir, struct dirent64* __entry, struct dirent64** __buffer) __INTRODUCED_IN(21); +int readdir_r(DIR* __dir, struct dirent* __entry, struct dirent** __buffer) __attribute__((__deprecated__("readdir_r is deprecated; use readdir instead"))); +int readdir64_r(DIR* __dir, struct dirent64* __entry, struct dirent64** __buffer) __INTRODUCED_IN(21) __attribute__((__deprecated__("readdir64_r is deprecated; use readdir64 instead"))); int closedir(DIR* __dir); void rewinddir(DIR* __dir); void seekdir(DIR* __dir, long __location) __INTRODUCED_IN(23); diff --git a/libc/include/elf.h b/libc/include/elf.h index 37450b231..a8d62db66 100644 --- a/libc/include/elf.h +++ b/libc/include/elf.h @@ -194,6 +194,10 @@ typedef struct { Elf64_Word vna_next; } Elf64_Vernaux; +/* Relocation table entry for relative (in section of type SHT_RELR). */ +typedef Elf32_Word Elf32_Relr; +typedef Elf64_Xword Elf64_Relr; + /* http://www.sco.com/developers/gabi/latest/ch5.dynamic.html */ #define DF_ORIGIN 0x00000001 #define DF_SYMBOLIC 0x00000002 @@ -242,6 +246,13 @@ typedef struct { #define DT_PREINIT_ARRAY 32 #define DT_PREINIT_ARRAYSZ 33 +/* Experimental support for SHT_RELR sections. For details, see proposal + at https://groups.google.com/forum/#!topic/generic-abi/bX460iggiKg */ +#define DT_RELR 0x6fffe000 +#define DT_RELRSZ 0x6fffe001 +#define DT_RELRENT 0x6fffe003 +#define DT_RELRCOUNT 0x6fffe005 + /* Android compressed rel/rela sections */ #define DT_ANDROID_REL (DT_LOOS + 2) #define DT_ANDROID_RELSZ (DT_LOOS + 3) @@ -494,6 +505,10 @@ typedef struct { #define SHT_LOOS 0x60000000 #define SHT_HIOS 0x6fffffff +/* Experimental support for SHT_RELR sections. For details, see proposal + at https://groups.google.com/forum/#!topic/generic-abi/bX460iggiKg */ +#define SHT_RELR 0x6fffff00 + /* http://www.sco.com/developers/gabi/latest/ch4.symtab.html */ #define STN_UNDEF 0 diff --git a/libc/include/pthread.h b/libc/include/pthread.h index 99515dabc..97f023dec 100644 --- a/libc/include/pthread.h +++ b/libc/include/pthread.h @@ -80,6 +80,9 @@ enum { #define PTHREAD_EXPLICIT_SCHED 0 #define PTHREAD_INHERIT_SCHED 1 +#define PTHREAD_PRIO_NONE 0 +#define PTHREAD_PRIO_INHERIT 1 + #define PTHREAD_PROCESS_PRIVATE 0 #define PTHREAD_PROCESS_SHARED 1 @@ -145,9 +148,11 @@ int pthread_key_delete(pthread_key_t __key); int pthread_mutexattr_destroy(pthread_mutexattr_t* __attr); int pthread_mutexattr_getpshared(const pthread_mutexattr_t* __attr, int* __shared); int pthread_mutexattr_gettype(const pthread_mutexattr_t* __attr, int* __type); +int pthread_mutexattr_getprotocol(const pthread_mutexattr_t* __attr, int* __protocol) __INTRODUCED_IN(28); int pthread_mutexattr_init(pthread_mutexattr_t* __attr); int pthread_mutexattr_setpshared(pthread_mutexattr_t* __attr, int __shared); int pthread_mutexattr_settype(pthread_mutexattr_t* __attr, int __type); +int pthread_mutexattr_setprotocol(pthread_mutexattr_t* __attr, int __protocol) __INTRODUCED_IN(28); int pthread_mutex_destroy(pthread_mutex_t* __mutex); int pthread_mutex_init(pthread_mutex_t* __mutex, const pthread_mutexattr_t* __attr); diff --git a/libc/include/sys/cdefs.h b/libc/include/sys/cdefs.h index 3cf6723be..be07007fc 100644 --- a/libc/include/sys/cdefs.h +++ b/libc/include/sys/cdefs.h @@ -300,6 +300,13 @@ * inline` without making them available externally. */ # define __BIONIC_FORTIFY_INLINE static __inline__ __always_inline +/* + * We should use __BIONIC_FORTIFY_VARIADIC instead of __BIONIC_FORTIFY_INLINE + * for variadic functions because compilers cannot inline them. + * The __always_inline attribute is useless, misleading, and could trigger + * clang compiler bug to incorrectly inline variadic functions. + */ +# define __BIONIC_FORTIFY_VARIADIC static __inline__ /* Error functions don't have bodies, so they can just be static. */ # define __BIONIC_ERROR_FUNCTION_VISIBILITY static # else @@ -311,6 +318,8 @@ # define __call_bypassing_fortify(fn) (fn) /* __BIONIC_FORTIFY_NONSTATIC_INLINE is pointless in GCC's FORTIFY */ # define __BIONIC_FORTIFY_INLINE extern __inline__ __always_inline __attribute__((gnu_inline)) __attribute__((__artificial__)) +/* __always_inline is probably okay and ignored by gcc in __BIONIC_FORTIFY_VARIADIC */ +# define __BIONIC_FORTIFY_VARIADIC __BIONIC_FORTIFY_INLINE # endif #else /* Further increase sharing for some inline functions */ diff --git a/libc/include/sys/ioctl.h b/libc/include/sys/ioctl.h index 76dc1ff7c..b48b7f9a6 100644 --- a/libc/include/sys/ioctl.h +++ b/libc/include/sys/ioctl.h @@ -36,8 +36,6 @@ * terminal-related ioctl data structures such as struct winsize. */ #include <linux/termios.h> -#include <asm/ioctls.h> -#include <asm/termbits.h> #include <linux/tty.h> #include <bits/ioctl.h> diff --git a/libc/libc.arm.map b/libc/libc.arm.map index abab36493..1ed4ec6e8 100644 --- a/libc/libc.arm.map +++ b/libc/libc.arm.map @@ -1372,6 +1372,8 @@ LIBC_P { # introduced=P posix_spawnp; pthread_attr_getinheritsched; pthread_attr_setinheritsched; + pthread_mutexattr_getprotocol; + pthread_mutexattr_setprotocol; pthread_setschedprio; sethostent; setnetent; diff --git a/libc/libc.arm64.map b/libc/libc.arm64.map index d464a0c41..f5117077b 100644 --- a/libc/libc.arm64.map +++ b/libc/libc.arm64.map @@ -1292,6 +1292,8 @@ LIBC_P { # introduced=P posix_spawnp; pthread_attr_getinheritsched; pthread_attr_setinheritsched; + pthread_mutexattr_getprotocol; + pthread_mutexattr_setprotocol; pthread_setschedprio; sethostent; setnetent; diff --git a/libc/libc.map.txt b/libc/libc.map.txt index 97965acea..09605607a 100644 --- a/libc/libc.map.txt +++ b/libc/libc.map.txt @@ -1397,6 +1397,8 @@ LIBC_P { # introduced=P posix_spawnp; pthread_attr_getinheritsched; pthread_attr_setinheritsched; + pthread_mutexattr_getprotocol; + pthread_mutexattr_setprotocol; pthread_setschedprio; sethostent; setnetent; diff --git a/libc/libc.mips.map b/libc/libc.mips.map index 930a1ca6e..1160f8783 100644 --- a/libc/libc.mips.map +++ b/libc/libc.mips.map @@ -1356,6 +1356,8 @@ LIBC_P { # introduced=P posix_spawnp; pthread_attr_getinheritsched; pthread_attr_setinheritsched; + pthread_mutexattr_getprotocol; + pthread_mutexattr_setprotocol; pthread_setschedprio; sethostent; setnetent; diff --git a/libc/libc.mips64.map b/libc/libc.mips64.map index d464a0c41..f5117077b 100644 --- a/libc/libc.mips64.map +++ b/libc/libc.mips64.map @@ -1292,6 +1292,8 @@ LIBC_P { # introduced=P posix_spawnp; pthread_attr_getinheritsched; pthread_attr_setinheritsched; + pthread_mutexattr_getprotocol; + pthread_mutexattr_setprotocol; pthread_setschedprio; sethostent; setnetent; diff --git a/libc/libc.x86.map b/libc/libc.x86.map index 27b9743de..b0b4b162b 100644 --- a/libc/libc.x86.map +++ b/libc/libc.x86.map @@ -1354,6 +1354,8 @@ LIBC_P { # introduced=P posix_spawnp; pthread_attr_getinheritsched; pthread_attr_setinheritsched; + pthread_mutexattr_getprotocol; + pthread_mutexattr_setprotocol; pthread_setschedprio; sethostent; setnetent; diff --git a/libc/libc.x86_64.map b/libc/libc.x86_64.map index d464a0c41..f5117077b 100644 --- a/libc/libc.x86_64.map +++ b/libc/libc.x86_64.map @@ -1292,6 +1292,8 @@ LIBC_P { # introduced=P posix_spawnp; pthread_attr_getinheritsched; pthread_attr_setinheritsched; + pthread_mutexattr_getprotocol; + pthread_mutexattr_setprotocol; pthread_setschedprio; sethostent; setnetent; diff --git a/libc/malloc_debug/DebugData.cpp b/libc/malloc_debug/DebugData.cpp index d6ca99886..76f8fbb1e 100644 --- a/libc/malloc_debug/DebugData.cpp +++ b/libc/malloc_debug/DebugData.cpp @@ -94,16 +94,25 @@ void DebugData::PrepareFork() { if (track != nullptr) { track->PrepareFork(); } + if (free_track != nullptr) { + free_track->PrepareFork(); + } } void DebugData::PostForkParent() { if (track != nullptr) { track->PostForkParent(); } + if (free_track != nullptr) { + free_track->PostForkParent(); + } } void DebugData::PostForkChild() { if (track != nullptr) { track->PostForkChild(); } + if (free_track != nullptr) { + free_track->PostForkChild(); + } } diff --git a/libc/malloc_debug/FreeTrackData.h b/libc/malloc_debug/FreeTrackData.h index 1758ef5b8..0e8c17742 100644 --- a/libc/malloc_debug/FreeTrackData.h +++ b/libc/malloc_debug/FreeTrackData.h @@ -57,6 +57,12 @@ class FreeTrackData : public OptionData { void LogBacktrace(const Header* header); + void PrepareFork() { pthread_mutex_lock(&mutex_); } + + void PostForkParent() { pthread_mutex_unlock(&mutex_); } + + void PostForkChild() { pthread_mutex_init(&mutex_, NULL); } + private: void LogFreeError(const Header* header, const uint8_t* pointer); void VerifyAndFree(const Header* header); diff --git a/libc/malloc_debug/MapData.h b/libc/malloc_debug/MapData.h index 023813910..895f78f85 100644 --- a/libc/malloc_debug/MapData.h +++ b/libc/malloc_debug/MapData.h @@ -41,7 +41,7 @@ struct MapEntry { MapEntry(uintptr_t start, uintptr_t end, uintptr_t offset, const char* name, size_t name_len) : start(start), end(end), offset(offset), name(name, name_len) {} - MapEntry(uintptr_t pc) : start(pc), end(pc) {} + explicit MapEntry(uintptr_t pc) : start(pc), end(pc) {} uintptr_t start; uintptr_t end; diff --git a/libc/malloc_debug/OptionData.h b/libc/malloc_debug/OptionData.h index 80190f54e..5c2d2728a 100644 --- a/libc/malloc_debug/OptionData.h +++ b/libc/malloc_debug/OptionData.h @@ -34,7 +34,7 @@ class DebugData; class OptionData { public: - OptionData(DebugData* debug) : debug_(debug) {} + explicit OptionData(DebugData* debug) : debug_(debug) {} ~OptionData() = default; protected: diff --git a/libc/malloc_debug/RecordData.h b/libc/malloc_debug/RecordData.h index 6e199239c..ccabac22f 100644 --- a/libc/malloc_debug/RecordData.h +++ b/libc/malloc_debug/RecordData.h @@ -66,7 +66,7 @@ class ThreadCompleteEntry : public RecordEntry { class AllocEntry : public RecordEntry { public: - AllocEntry(void* pointer); + explicit AllocEntry(void* pointer); virtual ~AllocEntry() = default; protected: @@ -92,7 +92,7 @@ class MallocEntry : public AllocEntry { class FreeEntry : public AllocEntry { public: - FreeEntry(void* pointer); + explicit FreeEntry(void* pointer); virtual ~FreeEntry() = default; std::string GetString() const override; diff --git a/libc/malloc_debug/TrackData.h b/libc/malloc_debug/TrackData.h index f7486e9d6..9a649b9ff 100644 --- a/libc/malloc_debug/TrackData.h +++ b/libc/malloc_debug/TrackData.h @@ -46,7 +46,7 @@ class DebugData; class TrackData : public OptionData { public: - TrackData(DebugData* debug_data); + explicit TrackData(DebugData* debug_data); virtual ~TrackData() = default; void GetList(std::vector<const Header*>* list); diff --git a/libc/private/CachedProperty.h b/libc/private/CachedProperty.h index 84ead010b..bd67d7405 100644 --- a/libc/private/CachedProperty.h +++ b/libc/private/CachedProperty.h @@ -38,7 +38,7 @@ class CachedProperty { public: // The lifetime of `property_name` must be greater than that of this CachedProperty. - CachedProperty(const char* property_name) + explicit CachedProperty(const char* property_name) : property_name_(property_name), prop_info_(nullptr), cached_area_serial_(0), diff --git a/libc/private/KernelArgumentBlock.h b/libc/private/KernelArgumentBlock.h index 68d499999..747186c66 100644 --- a/libc/private/KernelArgumentBlock.h +++ b/libc/private/KernelArgumentBlock.h @@ -32,7 +32,7 @@ struct abort_msg_t; // constituents for easy access. class KernelArgumentBlock { public: - KernelArgumentBlock(void* raw_args) { + explicit KernelArgumentBlock(void* raw_args) { uintptr_t* args = reinterpret_cast<uintptr_t*>(raw_args); argc = static_cast<int>(*args); argv = reinterpret_cast<char**>(args + 1); diff --git a/libc/private/ScopedSignalBlocker.h b/libc/private/ScopedSignalBlocker.h index 35d1c5830..c3ab30759 100644 --- a/libc/private/ScopedSignalBlocker.h +++ b/libc/private/ScopedSignalBlocker.h @@ -20,13 +20,14 @@ #include <signal.h> #include "bionic_macros.h" +#include "kernel_sigset_t.h" class ScopedSignalBlocker { public: explicit ScopedSignalBlocker() { - sigset_t set; - sigfillset(&set); - sigprocmask(SIG_BLOCK, &set, &old_set_); + kernel_sigset_t set; + set.fill(); + __rt_sigprocmask(SIG_SETMASK, &set, &old_set_, sizeof(set)); } ~ScopedSignalBlocker() { @@ -34,11 +35,11 @@ class ScopedSignalBlocker { } void reset() { - sigprocmask(SIG_SETMASK, &old_set_, nullptr); + __rt_sigprocmask(SIG_SETMASK, &old_set_, nullptr, sizeof(old_set_)); } private: - sigset_t old_set_; + kernel_sigset_t old_set_; DISALLOW_COPY_AND_ASSIGN(ScopedSignalBlocker); }; diff --git a/libc/private/bionic_futex.h b/libc/private/bionic_futex.h index 9b89131bd..fd68007d4 100644 --- a/libc/private/bionic_futex.h +++ b/libc/private/bionic_futex.h @@ -70,4 +70,11 @@ static inline int __futex_wait_ex(volatile void* ftx, bool shared, int value) { __LIBC_HIDDEN__ int __futex_wait_ex(volatile void* ftx, bool shared, int value, bool use_realtime_clock, const timespec* abs_timeout); +static inline int __futex_pi_unlock(volatile void* ftx, bool shared) { + return __futex(ftx, shared ? FUTEX_UNLOCK_PI : FUTEX_UNLOCK_PI_PRIVATE, 0, nullptr, 0); +} + +__LIBC_HIDDEN__ int __futex_pi_lock_ex(volatile void* ftx, bool shared, bool use_realtime_clock, + const timespec* abs_timeout); + #endif /* _BIONIC_FUTEX_H */ diff --git a/libc/private/bionic_mbstate.h b/libc/private/bionic_mbstate.h index 292959af5..352115aa7 100644 --- a/libc/private/bionic_mbstate.h +++ b/libc/private/bionic_mbstate.h @@ -29,6 +29,7 @@ #ifndef _BIONIC_MBSTATE_H #define _BIONIC_MBSTATE_H +#include <errno.h> #include <wchar.h> __BEGIN_DECLS diff --git a/libc/private/kernel_sigset_t.h b/libc/private/kernel_sigset_t.h index 9415fcf5d..bdfb729c6 100644 --- a/libc/private/kernel_sigset_t.h +++ b/libc/private/kernel_sigset_t.h @@ -17,18 +17,27 @@ #ifndef LIBC_PRIVATE_KERNEL_SIGSET_T_H_ #define LIBC_PRIVATE_KERNEL_SIGSET_T_H_ +#include <errno.h> #include <signal.h> +#include <async_safe/log.h> + // Our sigset_t is wrong for ARM and x86. It's 32-bit but the kernel expects 64 bits. -// This means we can't support real-time signals correctly until we can change the ABI. +// This means we can't support real-time signals correctly without breaking the ABI. // In the meantime, we can use this union to pass an appropriately-sized block of memory -// to the kernel, at the cost of not being able to refer to real-time signals. +// to the kernel, at the cost of not being able to refer to real-time signals when +// initializing from a sigset_t on LP32. union kernel_sigset_t { + public: kernel_sigset_t() { + } + + explicit kernel_sigset_t(int signal_number) { clear(); + if (!set(signal_number)) async_safe_fatal("kernel_sigset_t(%d)", signal_number); } - kernel_sigset_t(const sigset_t* value) { + explicit kernel_sigset_t(const sigset_t* value) { clear(); set(value); } @@ -37,7 +46,32 @@ union kernel_sigset_t { __builtin_memset(this, 0, sizeof(*this)); } + bool clear(int signal_number) { + int bit = bit_of(signal_number); + if (bit == -1) return false; + bits[bit / LONG_BIT] &= ~(1UL << (bit % LONG_BIT)); + return true; + } + + void fill() { + __builtin_memset(this, 0xff, sizeof(*this)); + } + + bool is_set(int signal_number) { + int bit = bit_of(signal_number); + if (bit == -1) return false; + return ((bits[bit / LONG_BIT] >> (bit % LONG_BIT)) & 1) == 1; + } + + bool set(int signal_number) { + int bit = bit_of(signal_number); + if (bit == -1) return false; + bits[bit / LONG_BIT] |= 1UL << (bit % LONG_BIT); + return true; + } + void set(const sigset_t* value) { + clear(); bionic = *value; } @@ -46,9 +80,21 @@ union kernel_sigset_t { } sigset_t bionic; -#ifndef __mips__ - uint32_t kernel[2]; -#endif + unsigned long bits[_KERNEL__NSIG/LONG_BIT]; + + private: + int bit_of(int signal_number) { + int bit = signal_number - 1; // Signal numbers start at 1, but bit positions start at 0. + if (bit < 0 || bit >= static_cast<int>(8*sizeof(*this))) { + errno = EINVAL; + return -1; + } + return bit; + } }; +extern "C" int __rt_sigpending(const kernel_sigset_t*, size_t); +extern "C" int __rt_sigprocmask(int, const kernel_sigset_t*, kernel_sigset_t*, size_t); +extern "C" int __rt_sigsuspend(const kernel_sigset_t*, size_t); + #endif diff --git a/libc/seccomp/arm64_app_policy.cpp b/libc/seccomp/arm64_app_policy.cpp index 12722e194..f7f0dc421 100644 --- a/libc/seccomp/arm64_app_policy.cpp +++ b/libc/seccomp/arm64_app_policy.cpp @@ -5,36 +5,62 @@ #include "seccomp_bpfs.h" const sock_filter arm64_app_filter[] = { -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 0, 0, 32), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 220, 15, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 101, 7, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 43, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 0, 0, 58), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 153, 29, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 101, 15, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 52, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 41, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 19, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 18, 27, 26), //io_setup|io_destroy|io_submit|io_cancel|io_getevents|setxattr|lsetxattr|fsetxattr|getxattr|lgetxattr|fgetxattr|listxattr|llistxattr|flistxattr|removexattr|lremovexattr|fremovexattr|getcwd -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 42, 26, 25), //eventfd2|epoll_create1|epoll_ctl|epoll_pwait|dup|dup3|fcntl|inotify_init1|inotify_add_watch|inotify_rm_watch|ioctl|ioprio_set|ioprio_get|flock|mknodat|mkdirat|unlinkat|symlinkat|linkat|renameat|umount2|mount|pivot_root +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 18, 52, 51), //io_setup|io_destroy|io_submit|io_cancel|io_getevents|setxattr|lsetxattr|fsetxattr|getxattr|lgetxattr|fgetxattr|listxattr|llistxattr|flistxattr|removexattr|lremovexattr|fremovexattr|getcwd +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 39, 51, 50), //eventfd2|epoll_create1|epoll_ctl|epoll_pwait|dup|dup3|fcntl|inotify_init1|inotify_add_watch|inotify_rm_watch|ioctl|ioprio_set|ioprio_get|flock|mknodat|mkdirat|unlinkat|symlinkat|linkat|renameat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 43, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 42, 49, 48), //pivot_root +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 51, 48, 47), //statfs|fstatfs|truncate|ftruncate|fallocate|faccessat|chdir|fchdir +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 90, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 59, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 58, 24, 23), //statfs|fstatfs|truncate|ftruncate|fallocate|faccessat|chdir|fchdir|chroot|fchmod|fchmodat|fchownat|fchown|openat|close -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 99, 23, 22), //pipe2|quotactl|getdents64|lseek|read|write|readv|writev|pread64|pwrite64|preadv|pwritev|sendfile|pselect6|ppoll|signalfd4|vmsplice|splice|tee|readlinkat|newfstatat|fstat|sync|fsync|fdatasync|sync_file_range|timerfd_create|timerfd_settime|timerfd_gettime|utimensat|acct|capget|capset|personality|exit|exit_group|waitid|set_tid_address|unshare|futex -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 198, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 105, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 104, 20, 19), //nanosleep|getitimer|setitimer -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 180, 19, 18), //init_module|delete_module|timer_create|timer_gettime|timer_getoverrun|timer_settime|timer_delete|clock_settime|clock_gettime|clock_getres|clock_nanosleep|syslog|ptrace|sched_setparam|sched_setscheduler|sched_getscheduler|sched_getparam|sched_setaffinity|sched_getaffinity|sched_yield|sched_get_priority_max|sched_get_priority_min|sched_rr_get_interval|restart_syscall|kill|tkill|tgkill|sigaltstack|rt_sigsuspend|rt_sigaction|rt_sigprocmask|rt_sigpending|rt_sigtimedwait|rt_sigqueueinfo|rt_sigreturn|setpriority|getpriority|reboot|setregid|setgid|setreuid|setuid|setresuid|getresuid|setresgid|getresgid|setfsuid|setfsgid|times|setpgid|getpgid|getsid|setsid|getgroups|setgroups|uname|sethostname|setdomainname|getrlimit|setrlimit|getrusage|umask|prctl|getcpu|gettimeofday|settimeofday|adjtimex|getpid|getppid|getuid|geteuid|getgid|getegid|gettid|sysinfo +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 58, 45, 44), //fchmod|fchmodat|fchownat|fchown|openat|close +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 89, 44, 43), //pipe2|quotactl|getdents64|lseek|read|write|readv|writev|pread64|pwrite64|preadv|pwritev|sendfile|pselect6|ppoll|signalfd4|vmsplice|splice|tee|readlinkat|newfstatat|fstat|sync|fsync|fdatasync|sync_file_range|timerfd_create|timerfd_settime|timerfd_gettime|utimensat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 92, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 91, 42, 41), //capget +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 99, 41, 40), //personality|exit|exit_group|waitid|set_tid_address|unshare|futex +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 143, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 113, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 107, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 104, 37, 36), //nanosleep|getitimer|setitimer +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 112, 36, 35), //timer_create|timer_gettime|timer_getoverrun|timer_settime|timer_delete +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 117, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 116, 34, 33), //clock_gettime|clock_getres|clock_nanosleep +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 142, 33, 32), //ptrace|sched_setparam|sched_setscheduler|sched_getscheduler|sched_getparam|sched_setaffinity|sched_getaffinity|sched_yield|sched_get_priority_max|sched_get_priority_min|sched_rr_get_interval|restart_syscall|kill|tkill|tgkill|sigaltstack|rt_sigsuspend|rt_sigaction|rt_sigprocmask|rt_sigpending|rt_sigtimedwait|rt_sigqueueinfo|rt_sigreturn|setpriority|getpriority +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 150, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 148, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 144, 30, 29), //setregid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 149, 29, 28), //getresuid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 151, 28, 27), //getresgid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 226, 13, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 198, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 163, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 160, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 159, 23, 22), //times|setpgid|getpgid|getsid|setsid|getgroups +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 161, 22, 21), //uname +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 172, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 170, 20, 19), //getrlimit|setrlimit|getrusage|umask|prctl|getcpu|gettimeofday +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 180, 19, 18), //getpid|getppid|getuid|geteuid|getgid|getegid|gettid|sysinfo +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 220, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 203, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 202, 17, 16), //socket|socketpair|bind|listen -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 217, 16, 15), //connect|getsockname|getpeername|sendto|recvfrom|setsockopt|getsockopt|shutdown|sendmsg|recvmsg|readahead|brk|munmap|mremap -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 266, 7, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 240, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 226, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 224, 12, 11), //clone|execve|mmap|fadvise64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 234, 11, 10), //mprotect|msync|mlock|munlock|mlockall|munlockall|mincore|madvise -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 260, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 202, 16, 15), //socket|socketpair|bind|listen +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 217, 15, 14), //connect|getsockname|getpeername|sendto|recvfrom|setsockopt|getsockopt|shutdown|sendmsg|recvmsg|readahead|brk|munmap|mremap +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 224, 14, 13), //clone|execve|mmap|fadvise64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 274, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 260, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 240, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 234, 10, 9), //mprotect|msync|mlock|munlock|mlockall|munlockall|mincore|madvise BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 244, 9, 8), //rt_tgsigqueueinfo|perf_event_open|accept4|recvmmsg -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 262, 8, 7), //wait4|prlimit64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 281, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 274, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 272, 5, 4), //clock_adjtime|syncfs|setns|sendmmsg|process_vm_readv|process_vm_writev -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 280, 4, 3), //sched_setattr|sched_getattr|renameat2|seccomp|getrandom|memfd_create -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 284, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 267, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 262, 7, 6), //wait4|prlimit64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 272, 6, 5), //syncfs|setns|sendmmsg|process_vm_readv|process_vm_writev +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 284, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 281, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 280, 3, 2), //sched_setattr|sched_getattr|renameat2|seccomp|getrandom|memfd_create BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 282, 2, 1), //execveat BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 288, 1, 0), //mlock2|copy_file_range|preadv2|pwritev2 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), diff --git a/libc/seccomp/arm64_global_policy.cpp b/libc/seccomp/arm64_global_policy.cpp index e2c594ecc..0a898decc 100644 --- a/libc/seccomp/arm64_global_policy.cpp +++ b/libc/seccomp/arm64_global_policy.cpp @@ -5,37 +5,35 @@ #include "seccomp_bpfs.h" const sock_filter arm64_global_filter[] = { -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 0, 0, 32), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 0, 0, 30), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 219, 15, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 101, 7, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 43, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 19, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 18, 27, 26), //io_setup|io_destroy|io_submit|io_cancel|io_getevents|setxattr|lsetxattr|fsetxattr|getxattr|lgetxattr|fgetxattr|listxattr|llistxattr|flistxattr|removexattr|lremovexattr|fremovexattr|getcwd -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 42, 26, 25), //eventfd2|epoll_create1|epoll_ctl|epoll_pwait|dup|dup3|fcntl|inotify_init1|inotify_add_watch|inotify_rm_watch|ioctl|ioprio_set|ioprio_get|flock|mknodat|mkdirat|unlinkat|symlinkat|linkat|renameat|umount2|mount|pivot_root +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 18, 25, 24), //io_setup|io_destroy|io_submit|io_cancel|io_getevents|setxattr|lsetxattr|fsetxattr|getxattr|lgetxattr|fgetxattr|listxattr|llistxattr|flistxattr|removexattr|lremovexattr|fremovexattr|getcwd +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 42, 24, 23), //eventfd2|epoll_create1|epoll_ctl|epoll_pwait|dup|dup3|fcntl|inotify_init1|inotify_add_watch|inotify_rm_watch|ioctl|ioprio_set|ioprio_get|flock|mknodat|mkdirat|unlinkat|symlinkat|linkat|renameat|umount2|mount|pivot_root BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 59, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 58, 24, 23), //statfs|fstatfs|truncate|ftruncate|fallocate|faccessat|chdir|fchdir|chroot|fchmod|fchmodat|fchownat|fchown|openat|close -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 99, 23, 22), //pipe2|quotactl|getdents64|lseek|read|write|readv|writev|pread64|pwrite64|preadv|pwritev|sendfile|pselect6|ppoll|signalfd4|vmsplice|splice|tee|readlinkat|newfstatat|fstat|sync|fsync|fdatasync|sync_file_range|timerfd_create|timerfd_settime|timerfd_gettime|utimensat|acct|capget|capset|personality|exit|exit_group|waitid|set_tid_address|unshare|futex +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 58, 22, 21), //statfs|fstatfs|truncate|ftruncate|fallocate|faccessat|chdir|fchdir|chroot|fchmod|fchmodat|fchownat|fchown|openat|close +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 99, 21, 20), //pipe2|quotactl|getdents64|lseek|read|write|readv|writev|pread64|pwrite64|preadv|pwritev|sendfile|pselect6|ppoll|signalfd4|vmsplice|splice|tee|readlinkat|newfstatat|fstat|sync|fsync|fdatasync|sync_file_range|timerfd_create|timerfd_settime|timerfd_gettime|utimensat|acct|capget|capset|personality|exit|exit_group|waitid|set_tid_address|unshare|futex BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 198, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 105, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 104, 20, 19), //nanosleep|getitimer|setitimer -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 180, 19, 18), //init_module|delete_module|timer_create|timer_gettime|timer_getoverrun|timer_settime|timer_delete|clock_settime|clock_gettime|clock_getres|clock_nanosleep|syslog|ptrace|sched_setparam|sched_setscheduler|sched_getscheduler|sched_getparam|sched_setaffinity|sched_getaffinity|sched_yield|sched_get_priority_max|sched_get_priority_min|sched_rr_get_interval|restart_syscall|kill|tkill|tgkill|sigaltstack|rt_sigsuspend|rt_sigaction|rt_sigprocmask|rt_sigpending|rt_sigtimedwait|rt_sigqueueinfo|rt_sigreturn|setpriority|getpriority|reboot|setregid|setgid|setreuid|setuid|setresuid|getresuid|setresgid|getresgid|setfsuid|setfsgid|times|setpgid|getpgid|getsid|setsid|getgroups|setgroups|uname|sethostname|setdomainname|getrlimit|setrlimit|getrusage|umask|prctl|getcpu|gettimeofday|settimeofday|adjtimex|getpid|getppid|getuid|geteuid|getgid|getegid|gettid|sysinfo +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 104, 18, 17), //nanosleep|getitimer|setitimer +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 180, 17, 16), //init_module|delete_module|timer_create|timer_gettime|timer_getoverrun|timer_settime|timer_delete|clock_settime|clock_gettime|clock_getres|clock_nanosleep|syslog|ptrace|sched_setparam|sched_setscheduler|sched_getscheduler|sched_getparam|sched_setaffinity|sched_getaffinity|sched_yield|sched_get_priority_max|sched_get_priority_min|sched_rr_get_interval|restart_syscall|kill|tkill|tgkill|sigaltstack|rt_sigsuspend|rt_sigaction|rt_sigprocmask|rt_sigpending|rt_sigtimedwait|rt_sigqueueinfo|rt_sigreturn|setpriority|getpriority|reboot|setregid|setgid|setreuid|setuid|setresuid|getresuid|setresgid|getresgid|setfsuid|setfsgid|times|setpgid|getpgid|getsid|setsid|getgroups|setgroups|uname|sethostname|setdomainname|getrlimit|setrlimit|getrusage|umask|prctl|getcpu|gettimeofday|settimeofday|adjtimex|getpid|getppid|getuid|geteuid|getgid|getegid|gettid|sysinfo BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 203, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 202, 17, 16), //socket|socketpair|bind|listen -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 218, 16, 15), //connect|getsockname|getpeername|sendto|recvfrom|setsockopt|getsockopt|shutdown|sendmsg|recvmsg|readahead|brk|munmap|mremap|add_key +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 202, 15, 14), //socket|socketpair|bind|listen +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 218, 14, 13), //connect|getsockname|getpeername|sendto|recvfrom|setsockopt|getsockopt|shutdown|sendmsg|recvmsg|readahead|brk|munmap|mremap|add_key BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 266, 7, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 240, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 226, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 225, 12, 11), //keyctl|clone|execve|mmap|fadvise64|swapon -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 234, 11, 10), //mprotect|msync|mlock|munlock|mlockall|munlockall|mincore|madvise +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 225, 10, 9), //keyctl|clone|execve|mmap|fadvise64|swapon +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 234, 9, 8), //mprotect|msync|mlock|munlock|mlockall|munlockall|mincore|madvise BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 260, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 244, 9, 8), //rt_tgsigqueueinfo|perf_event_open|accept4|recvmmsg -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 262, 8, 7), //wait4|prlimit64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 281, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 244, 7, 6), //rt_tgsigqueueinfo|perf_event_open|accept4|recvmmsg +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 262, 6, 5), //wait4|prlimit64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 284, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 273, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 272, 5, 4), //clock_adjtime|syncfs|setns|sendmmsg|process_vm_readv|process_vm_writev -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 280, 4, 3), //finit_module|sched_setattr|sched_getattr|renameat2|seccomp|getrandom|memfd_create -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 284, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 282, 2, 1), //execveat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 272, 3, 2), //clock_adjtime|syncfs|setns|sendmmsg|process_vm_readv|process_vm_writev +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 282, 2, 1), //finit_module|sched_setattr|sched_getattr|renameat2|seccomp|getrandom|memfd_create|bpf|execveat BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 288, 1, 0), //mlock2|copy_file_range|preadv2|pwritev2 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), }; diff --git a/libc/seccomp/arm64_system_policy.cpp b/libc/seccomp/arm64_system_policy.cpp index a8d71932d..51bf12de7 100644 --- a/libc/seccomp/arm64_system_policy.cpp +++ b/libc/seccomp/arm64_system_policy.cpp @@ -5,37 +5,35 @@ #include "seccomp_bpfs.h" const sock_filter arm64_system_filter[] = { -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 0, 0, 32), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 0, 0, 30), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 220, 15, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 101, 7, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 43, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 19, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 18, 27, 26), //io_setup|io_destroy|io_submit|io_cancel|io_getevents|setxattr|lsetxattr|fsetxattr|getxattr|lgetxattr|fgetxattr|listxattr|llistxattr|flistxattr|removexattr|lremovexattr|fremovexattr|getcwd -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 42, 26, 25), //eventfd2|epoll_create1|epoll_ctl|epoll_pwait|dup|dup3|fcntl|inotify_init1|inotify_add_watch|inotify_rm_watch|ioctl|ioprio_set|ioprio_get|flock|mknodat|mkdirat|unlinkat|symlinkat|linkat|renameat|umount2|mount|pivot_root +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 18, 25, 24), //io_setup|io_destroy|io_submit|io_cancel|io_getevents|setxattr|lsetxattr|fsetxattr|getxattr|lgetxattr|fgetxattr|listxattr|llistxattr|flistxattr|removexattr|lremovexattr|fremovexattr|getcwd +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 42, 24, 23), //eventfd2|epoll_create1|epoll_ctl|epoll_pwait|dup|dup3|fcntl|inotify_init1|inotify_add_watch|inotify_rm_watch|ioctl|ioprio_set|ioprio_get|flock|mknodat|mkdirat|unlinkat|symlinkat|linkat|renameat|umount2|mount|pivot_root BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 59, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 58, 24, 23), //statfs|fstatfs|truncate|ftruncate|fallocate|faccessat|chdir|fchdir|chroot|fchmod|fchmodat|fchownat|fchown|openat|close -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 99, 23, 22), //pipe2|quotactl|getdents64|lseek|read|write|readv|writev|pread64|pwrite64|preadv|pwritev|sendfile|pselect6|ppoll|signalfd4|vmsplice|splice|tee|readlinkat|newfstatat|fstat|sync|fsync|fdatasync|sync_file_range|timerfd_create|timerfd_settime|timerfd_gettime|utimensat|acct|capget|capset|personality|exit|exit_group|waitid|set_tid_address|unshare|futex +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 58, 22, 21), //statfs|fstatfs|truncate|ftruncate|fallocate|faccessat|chdir|fchdir|chroot|fchmod|fchmodat|fchownat|fchown|openat|close +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 99, 21, 20), //pipe2|quotactl|getdents64|lseek|read|write|readv|writev|pread64|pwrite64|preadv|pwritev|sendfile|pselect6|ppoll|signalfd4|vmsplice|splice|tee|readlinkat|newfstatat|fstat|sync|fsync|fdatasync|sync_file_range|timerfd_create|timerfd_settime|timerfd_gettime|utimensat|acct|capget|capset|personality|exit|exit_group|waitid|set_tid_address|unshare|futex BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 198, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 105, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 104, 20, 19), //nanosleep|getitimer|setitimer -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 180, 19, 18), //init_module|delete_module|timer_create|timer_gettime|timer_getoverrun|timer_settime|timer_delete|clock_settime|clock_gettime|clock_getres|clock_nanosleep|syslog|ptrace|sched_setparam|sched_setscheduler|sched_getscheduler|sched_getparam|sched_setaffinity|sched_getaffinity|sched_yield|sched_get_priority_max|sched_get_priority_min|sched_rr_get_interval|restart_syscall|kill|tkill|tgkill|sigaltstack|rt_sigsuspend|rt_sigaction|rt_sigprocmask|rt_sigpending|rt_sigtimedwait|rt_sigqueueinfo|rt_sigreturn|setpriority|getpriority|reboot|setregid|setgid|setreuid|setuid|setresuid|getresuid|setresgid|getresgid|setfsuid|setfsgid|times|setpgid|getpgid|getsid|setsid|getgroups|setgroups|uname|sethostname|setdomainname|getrlimit|setrlimit|getrusage|umask|prctl|getcpu|gettimeofday|settimeofday|adjtimex|getpid|getppid|getuid|geteuid|getgid|getegid|gettid|sysinfo +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 104, 18, 17), //nanosleep|getitimer|setitimer +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 180, 17, 16), //init_module|delete_module|timer_create|timer_gettime|timer_getoverrun|timer_settime|timer_delete|clock_settime|clock_gettime|clock_getres|clock_nanosleep|syslog|ptrace|sched_setparam|sched_setscheduler|sched_getscheduler|sched_getparam|sched_setaffinity|sched_getaffinity|sched_yield|sched_get_priority_max|sched_get_priority_min|sched_rr_get_interval|restart_syscall|kill|tkill|tgkill|sigaltstack|rt_sigsuspend|rt_sigaction|rt_sigprocmask|rt_sigpending|rt_sigtimedwait|rt_sigqueueinfo|rt_sigreturn|setpriority|getpriority|reboot|setregid|setgid|setreuid|setuid|setresuid|getresuid|setresgid|getresgid|setfsuid|setfsgid|times|setpgid|getpgid|getsid|setsid|getgroups|setgroups|uname|sethostname|setdomainname|getrlimit|setrlimit|getrusage|umask|prctl|getcpu|gettimeofday|settimeofday|adjtimex|getpid|getppid|getuid|geteuid|getgid|getegid|gettid|sysinfo BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 203, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 202, 17, 16), //socket|socketpair|bind|listen -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 217, 16, 15), //connect|getsockname|getpeername|sendto|recvfrom|setsockopt|getsockopt|shutdown|sendmsg|recvmsg|readahead|brk|munmap|mremap +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 202, 15, 14), //socket|socketpair|bind|listen +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 217, 14, 13), //connect|getsockname|getpeername|sendto|recvfrom|setsockopt|getsockopt|shutdown|sendmsg|recvmsg|readahead|brk|munmap|mremap BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 266, 7, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 240, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 226, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 224, 12, 11), //clone|execve|mmap|fadvise64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 234, 11, 10), //mprotect|msync|mlock|munlock|mlockall|munlockall|mincore|madvise +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 224, 10, 9), //clone|execve|mmap|fadvise64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 234, 9, 8), //mprotect|msync|mlock|munlock|mlockall|munlockall|mincore|madvise BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 260, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 244, 9, 8), //rt_tgsigqueueinfo|perf_event_open|accept4|recvmmsg -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 262, 8, 7), //wait4|prlimit64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 281, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 244, 7, 6), //rt_tgsigqueueinfo|perf_event_open|accept4|recvmmsg +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 262, 6, 5), //wait4|prlimit64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 284, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 274, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 272, 5, 4), //clock_adjtime|syncfs|setns|sendmmsg|process_vm_readv|process_vm_writev -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 280, 4, 3), //sched_setattr|sched_getattr|renameat2|seccomp|getrandom|memfd_create -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 284, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 282, 2, 1), //execveat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 272, 3, 2), //clock_adjtime|syncfs|setns|sendmmsg|process_vm_readv|process_vm_writev +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 282, 2, 1), //sched_setattr|sched_getattr|renameat2|seccomp|getrandom|memfd_create|bpf|execveat BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 288, 1, 0), //mlock2|copy_file_range|preadv2|pwritev2 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), }; diff --git a/libc/seccomp/arm_app_policy.cpp b/libc/seccomp/arm_app_policy.cpp index d0fd6cacb..b5d98dce4 100644 --- a/libc/seccomp/arm_app_policy.cpp +++ b/libc/seccomp/arm_app_policy.cpp @@ -5,130 +5,136 @@ #include "seccomp_bpfs.h" const sock_filter arm_app_filter[] = { -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 0, 0, 126), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 150, 63, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 74, 31, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 41, 15, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 24, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 0, 0, 132), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 183, 65, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 85, 33, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 45, 17, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 26, 9, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 19, 5, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 10, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 8, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 7, 119, 118), //restart_syscall|exit|fork|read|write|open|close -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 9, 118, 117), //creat -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 19, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 13, 116, 115), //unlink|execve|chdir -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 22, 115, 114), //lseek|getpid|mount -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 33, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 26, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 25, 112, 111), //getuid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 27, 111, 110), //ptrace -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 36, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 34, 109, 108), //access -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 40, 108, 107), //sync|kill|rename|mkdir -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 57, 7, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 51, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 45, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 44, 104, 103), //dup|pipe|times -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 46, 103, 102), //brk +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 7, 124, 123), //restart_syscall|exit|fork|read|write|open|close +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 9, 123, 122), //creat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 13, 122, 121), //unlink|execve|chdir +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 24, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 21, 120, 119), //lseek|getpid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 25, 119, 118), //getuid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 36, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 33, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 27, 116, 115), //ptrace +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 34, 115, 114), //access +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 41, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 40, 113, 112), //sync|kill|rename|mkdir +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 44, 112, 111), //dup|pipe|times +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 63, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 57, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 54, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 53, 101, 100), //acct|umount2 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 56, 100, 99), //ioctl|fcntl -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 63, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 46, 108, 107), //brk +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 56, 107, 106), //ioctl|fcntl BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 60, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 58, 97, 96), //setpgid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 62, 96, 95), //umask|chroot +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 58, 105, 104), //setpgid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 61, 104, 103), //umask +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 75, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 66, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 65, 94, 93), //dup2|getppid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 68, 93, 92), //setsid|sigaction -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 114, 15, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 91, 7, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 85, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 65, 101, 100), //dup2|getppid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 68, 100, 99), //setsid|sigaction BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 77, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 76, 88, 87), //sethostname|setrlimit -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 80, 87, 86), //getrusage|gettimeofday|settimeofday -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 88, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 86, 85, 84), //readlink -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 89, 84, 83), //reboot -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 96, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 94, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 93, 81, 80), //munmap|truncate -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 95, 80, 79), //fchmod -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 103, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 98, 78, 77), //getpriority|setpriority -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 106, 77, 76), //syslog|setitimer|getitimer -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 128, 7, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 118, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 116, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 115, 73, 72), //wait4 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 117, 72, 71), //sysinfo -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 124, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 123, 70, 69), //fsync|sigreturn|clone|setdomainname|uname -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 126, 69, 68), //adjtimex|mprotect -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 136, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 131, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 130, 66, 65), //init_module|delete_module -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 134, 65, 64), //quotactl|getpgid|fchdir -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 138, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 137, 63, 62), //personality -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 149, 62, 61), //setfsuid|setfsgid|_llseek|getdents|_newselect|flock|msync|readv|writev|getsid|fdatasync -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 292, 31, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 219, 15, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 190, 7, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 172, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 168, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 164, 56, 55), //mlock|munlock|mlockall|munlockall|sched_setparam|sched_getparam|sched_setscheduler|sched_getscheduler|sched_yield|sched_get_priority_max|sched_get_priority_min|sched_rr_get_interval|nanosleep|mremap -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 169, 55, 54), //poll -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 183, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 182, 53, 52), //prctl|rt_sigreturn|rt_sigaction|rt_sigprocmask|rt_sigpending|rt_sigtimedwait|rt_sigqueueinfo|rt_sigsuspend|pread64|pwrite64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 188, 52, 51), //getcwd|capget|capset|sigaltstack|sendfile -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 213, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 199, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 198, 49, 48), //vfork|ugetrlimit|mmap2|truncate64|ftruncate64|stat64|lstat64|fstat64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 212, 48, 47), //getuid32|getgid32|geteuid32|getegid32|setreuid32|setregid32|getgroups32|setgroups32|fchown32|setresuid32|getresuid32|setresgid32|getresgid32 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 76, 98, 97), //setrlimit +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 79, 97, 96), //getrusage|gettimeofday +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 122, 15, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 104, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 94, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 91, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 86, 92, 91), //readlink +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 93, 91, 90), //munmap|truncate +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 96, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 95, 89, 88), //fchmod +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 98, 88, 87), //getpriority|setpriority +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 116, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 114, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 106, 85, 84), //setitimer|getitimer +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 115, 84, 83), //wait4 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 118, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 117, 82, 81), //sysinfo +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 121, 81, 80), //fsync|sigreturn|clone +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 140, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 131, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 125, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 123, 77, 76), //uname +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 126, 76, 75), //mprotect +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 136, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 134, 74, 73), //quotactl|getpgid|fchdir +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 137, 73, 72), //personality +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 168, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 150, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 149, 70, 69), //_llseek|getdents|_newselect|flock|msync|readv|writev|getsid|fdatasync +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 164, 69, 68), //mlock|munlock|mlockall|munlockall|sched_setparam|sched_getparam|sched_setscheduler|sched_getscheduler|sched_yield|sched_get_priority_max|sched_get_priority_min|sched_rr_get_interval|nanosleep|mremap +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 172, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 169, 67, 66), //poll +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 182, 66, 65), //prctl|rt_sigreturn|rt_sigaction|rt_sigprocmask|rt_sigpending|rt_sigtimedwait|rt_sigqueueinfo|rt_sigsuspend|pread64|pwrite64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 290, 33, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 219, 17, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 207, 9, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 199, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 190, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 186, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 185, 59, 58), //getcwd|capget +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 188, 58, 57), //sigaltstack|sendfile +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 198, 57, 56), //vfork|ugetrlimit|mmap2|truncate64|ftruncate64|stat64|lstat64|fstat64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 204, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 203, 55, 54), //getuid32|getgid32|geteuid32|getegid32 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 206, 54, 53), //setregid32|getgroups32 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 211, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 209, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 208, 51, 50), //fchown32 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 210, 50, 49), //getresuid32 BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 217, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 215, 46, 45), //setuid32|setgid32 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 218, 45, 44), //getdents64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 270, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 212, 48, 47), //getresgid32 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 218, 47, 46), //getdents64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 263, 7, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 250, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 224, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 222, 41, 40), //mincore|madvise|fcntl64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 249, 40, 39), //gettid|readahead|setxattr|lsetxattr|fsetxattr|getxattr|lgetxattr|fgetxattr|listxattr|llistxattr|flistxattr|removexattr|lremovexattr|fremovexattr|tkill|sendfile64|futex|sched_setaffinity|sched_getaffinity|io_setup|io_destroy|io_getevents|io_submit|io_cancel|exit_group +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 222, 43, 42), //mincore|madvise|fcntl64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 249, 42, 41), //gettid|readahead|setxattr|lsetxattr|fsetxattr|getxattr|lgetxattr|fgetxattr|listxattr|llistxattr|flistxattr|removexattr|lremovexattr|fremovexattr|tkill|sendfile64|futex|sched_setaffinity|sched_getaffinity|io_setup|io_destroy|io_getevents|io_submit|io_cancel|exit_group BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 256, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 254, 38, 37), //epoll_create|epoll_ctl|epoll_wait|remap_file_pages -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 269, 37, 36), //set_tid_address|timer_create|timer_settime|timer_gettime|timer_getoverrun|timer_delete|clock_settime|clock_gettime|clock_getres|clock_nanosleep|statfs64|fstatfs64|tgkill -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 286, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 280, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 271, 34, 33), //arm_fadvise64_64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 254, 40, 39), //epoll_create|epoll_ctl|epoll_wait|remap_file_pages +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 262, 39, 38), //set_tid_address|timer_create|timer_settime|timer_gettime|timer_getoverrun|timer_delete +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 280, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 270, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 269, 36, 35), //clock_gettime|clock_getres|clock_nanosleep|statfs64|fstatfs64|tgkill +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 271, 35, 34), //arm_fadvise64_64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 286, 1, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 285, 33, 32), //waitid|socket|bind|connect|listen -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 290, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 289, 31, 30), //getsockname|getpeername|socketpair -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 291, 30, 29), //sendto -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 369, 15, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 340, 7, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 322, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 316, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 298, 25, 24), //recvfrom|shutdown|setsockopt|getsockopt|sendmsg|recvmsg +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 289, 32, 31), //getsockname|getpeername|socketpair +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 350, 15, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 327, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 316, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 292, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 291, 27, 26), //sendto +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 298, 26, 25), //recvfrom|shutdown|setsockopt|getsockopt|sendmsg|recvmsg +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 322, 1, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 319, 24, 23), //inotify_init|inotify_add_watch|inotify_rm_watch -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 327, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 326, 22, 21), //openat|mkdirat|mknodat|fchownat -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 338, 21, 20), //fstatat64|unlinkat|renameat|linkat|symlinkat|readlinkat|fchmodat|faccessat|pselect6|ppoll|unshare -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 348, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 345, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 344, 18, 17), //splice|sync_file_range2|tee|vmsplice +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 326, 23, 22), //openat|mkdirat|mknodat|fchownat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 345, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 340, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 338, 20, 19), //fstatat64|unlinkat|renameat|linkat|symlinkat|readlinkat|fchmodat|faccessat|pselect6|ppoll|unshare +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 344, 19, 18), //splice|sync_file_range2|tee|vmsplice +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 348, 1, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 347, 17, 16), //getcpu|epoll_pwait -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 350, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 349, 15, 14), //utimensat -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 367, 14, 13), //timerfd_create|eventfd|fallocate|timerfd_settime|timerfd_gettime|signalfd4|eventfd2|epoll_create1|dup3|pipe2|inotify_init1|preadv|pwritev|rt_tgsigqueueinfo|perf_event_open|recvmmsg|accept4 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 390, 7, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 380, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 372, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 370, 10, 9), //prlimit64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 378, 9, 8), //clock_adjtime|syncfs|sendmmsg|setns|process_vm_readv|process_vm_writev -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 387, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 386, 7, 6), //sched_setattr|sched_getattr|renameat2|seccomp|getrandom|memfd_create -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 388, 6, 5), //execveat -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 983045, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 983042, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 394, 3, 2), //mlock2|copy_file_range|preadv2|pwritev2 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 349, 16, 15), //utimensat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 387, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 373, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 369, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 367, 12, 11), //timerfd_create|eventfd|fallocate|timerfd_settime|timerfd_gettime|signalfd4|eventfd2|epoll_create1|dup3|pipe2|inotify_init1|preadv|pwritev|rt_tgsigqueueinfo|perf_event_open|recvmmsg|accept4 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 370, 11, 10), //prlimit64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 380, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 378, 9, 8), //syncfs|sendmmsg|setns|process_vm_readv|process_vm_writev +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 386, 8, 7), //sched_setattr|sched_getattr|renameat2|seccomp|getrandom|memfd_create +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 983042, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 390, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 388, 5, 4), //execveat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 394, 4, 3), //mlock2|copy_file_range|preadv2|pwritev2 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 983045, 1, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 983043, 2, 1), //__ARM_NR_cacheflush BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 983046, 1, 0), //__ARM_NR_set_tls BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), diff --git a/libc/seccomp/arm_global_policy.cpp b/libc/seccomp/arm_global_policy.cpp index d7b5d7ef8..ea158a577 100644 --- a/libc/seccomp/arm_global_policy.cpp +++ b/libc/seccomp/arm_global_policy.cpp @@ -5,132 +5,130 @@ #include "seccomp_bpfs.h" const sock_filter arm_global_filter[] = { -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 0, 0, 130), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 168, 65, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 77, 33, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 45, 17, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 26, 9, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 19, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 0, 0, 128), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 150, 63, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 74, 31, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 41, 15, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 24, 7, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 10, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 8, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 7, 122, 121), //restart_syscall|exit|fork|read|write|open|close -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 9, 121, 120), //creat -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 13, 120, 119), //unlink|execve|chdir -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 24, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 22, 118, 117), //lseek|getpid|mount -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 25, 117, 116), //getuid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 36, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 33, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 27, 114, 113), //ptrace -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 34, 113, 112), //access -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 41, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 40, 111, 110), //sync|kill|rename|mkdir -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 44, 110, 109), //dup|pipe|times -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 60, 7, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 54, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 51, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 46, 106, 105), //brk -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 53, 105, 104), //acct|umount2 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 57, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 56, 103, 102), //ioctl|fcntl -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 58, 102, 101), //setpgid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 66, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 63, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 62, 99, 98), //umask|chroot -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 65, 98, 97), //dup2|getppid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 74, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 68, 96, 95), //setsid|sigaction -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 76, 95, 94), //sethostname|setrlimit -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 116, 15, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 94, 7, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 87, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 85, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 80, 90, 89), //getrusage|gettimeofday|settimeofday -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 86, 89, 88), //readlink -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 91, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 89, 87, 86), //swapon|reboot -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 93, 86, 85), //munmap|truncate -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 103, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 96, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 95, 83, 82), //fchmod -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 98, 82, 81), //getpriority|setpriority -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 114, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 106, 80, 79), //syslog|setitimer|getitimer -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 115, 79, 78), //wait4 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 131, 7, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 124, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 118, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 117, 75, 74), //sysinfo -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 123, 74, 73), //fsync|sigreturn|clone|setdomainname|uname -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 128, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 126, 72, 71), //adjtimex|mprotect -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 130, 71, 70), //init_module|delete_module -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 138, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 136, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 134, 68, 67), //quotactl|getpgid|fchdir -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 137, 67, 66), //personality -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 150, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 149, 65, 64), //setfsuid|setfsgid|_llseek|getdents|_newselect|flock|msync|readv|writev|getsid|fdatasync -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 164, 64, 63), //mlock|munlock|mlockall|munlockall|sched_setparam|sched_getparam|sched_setscheduler|sched_getscheduler|sched_yield|sched_get_priority_max|sched_get_priority_min|sched_rr_get_interval|nanosleep|mremap -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 309, 31, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 224, 15, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 199, 7, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 183, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 172, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 169, 58, 57), //poll -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 182, 57, 56), //prctl|rt_sigreturn|rt_sigaction|rt_sigprocmask|rt_sigpending|rt_sigtimedwait|rt_sigqueueinfo|rt_sigsuspend|pread64|pwrite64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 190, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 188, 55, 54), //getcwd|capget|capset|sigaltstack|sendfile -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 198, 54, 53), //vfork|ugetrlimit|mmap2|truncate64|ftruncate64|stat64|lstat64|fstat64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 217, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 213, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 212, 51, 50), //getuid32|getgid32|geteuid32|getegid32|setreuid32|setregid32|getgroups32|setgroups32|fchown32|setresuid32|getresuid32|setresgid32|getresgid32 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 215, 50, 49), //setuid32|setgid32 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 219, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 218, 48, 47), //getdents64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 222, 47, 46), //mincore|madvise|fcntl64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 280, 7, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 256, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 250, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 249, 43, 42), //gettid|readahead|setxattr|lsetxattr|fsetxattr|getxattr|lgetxattr|fgetxattr|listxattr|llistxattr|flistxattr|removexattr|lremovexattr|fremovexattr|tkill|sendfile64|futex|sched_setaffinity|sched_getaffinity|io_setup|io_destroy|io_getevents|io_submit|io_cancel|exit_group -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 254, 42, 41), //epoll_create|epoll_ctl|epoll_wait|remap_file_pages -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 270, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 269, 40, 39), //set_tid_address|timer_create|timer_settime|timer_gettime|timer_getoverrun|timer_delete|clock_settime|clock_gettime|clock_getres|clock_nanosleep|statfs64|fstatfs64|tgkill -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 271, 39, 38), //arm_fadvise64_64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 290, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 286, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 285, 36, 35), //waitid|socket|bind|connect|listen -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 289, 35, 34), //getsockname|getpeername|socketpair -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 292, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 291, 33, 32), //sendto -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 298, 32, 31), //recvfrom|shutdown|setsockopt|getsockopt|sendmsg|recvmsg -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 350, 15, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 327, 7, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 316, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 311, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 310, 27, 26), //add_key -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 312, 26, 25), //keyctl -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 322, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 319, 24, 23), //inotify_init|inotify_add_watch|inotify_rm_watch -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 326, 23, 22), //openat|mkdirat|mknodat|fchownat -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 345, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 340, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 338, 20, 19), //fstatat64|unlinkat|renameat|linkat|symlinkat|readlinkat|fchmodat|faccessat|pselect6|ppoll|unshare -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 344, 19, 18), //splice|sync_file_range2|tee|vmsplice -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 348, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 347, 17, 16), //getcpu|epoll_pwait -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 349, 16, 15), //utimensat -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 387, 7, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 372, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 369, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 367, 12, 11), //timerfd_create|eventfd|fallocate|timerfd_settime|timerfd_gettime|signalfd4|eventfd2|epoll_create1|dup3|pipe2|inotify_init1|preadv|pwritev|rt_tgsigqueueinfo|perf_event_open|recvmmsg|accept4 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 370, 11, 10), //prlimit64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 379, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 378, 9, 8), //clock_adjtime|syncfs|sendmmsg|setns|process_vm_readv|process_vm_writev -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 386, 8, 7), //finit_module|sched_setattr|sched_getattr|renameat2|seccomp|getrandom|memfd_create +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 7, 121, 120), //restart_syscall|exit|fork|read|write|open|close +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 9, 120, 119), //creat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 19, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 13, 118, 117), //unlink|execve|chdir +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 22, 117, 116), //lseek|getpid|mount +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 33, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 26, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 25, 114, 113), //getuid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 27, 113, 112), //ptrace +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 36, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 34, 111, 110), //access +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 40, 110, 109), //sync|kill|rename|mkdir +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 57, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 51, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 45, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 44, 106, 105), //dup|pipe|times +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 46, 105, 104), //brk +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 54, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 53, 103, 102), //acct|umount2 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 56, 102, 101), //ioctl|fcntl +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 63, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 60, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 58, 99, 98), //setpgid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 62, 98, 97), //umask|chroot +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 66, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 65, 96, 95), //dup2|getppid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 68, 95, 94), //setsid|sigaction +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 114, 15, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 91, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 85, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 77, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 76, 90, 89), //sethostname|setrlimit +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 80, 89, 88), //getrusage|gettimeofday|settimeofday +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 87, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 86, 87, 86), //readlink +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 89, 86, 85), //swapon|reboot +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 96, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 94, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 93, 83, 82), //munmap|truncate +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 95, 82, 81), //fchmod +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 103, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 98, 80, 79), //getpriority|setpriority +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 106, 79, 78), //syslog|setitimer|getitimer +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 128, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 118, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 116, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 115, 75, 74), //wait4 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 117, 74, 73), //sysinfo +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 124, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 123, 72, 71), //fsync|sigreturn|clone|setdomainname|uname +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 126, 71, 70), //adjtimex|mprotect +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 136, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 131, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 130, 68, 67), //init_module|delete_module +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 134, 67, 66), //quotactl|getpgid|fchdir +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 138, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 137, 65, 64), //personality +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 149, 64, 63), //setfsuid|setfsgid|_llseek|getdents|_newselect|flock|msync|readv|writev|getsid|fdatasync +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 292, 31, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 219, 15, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 190, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 172, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 168, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 164, 58, 57), //mlock|munlock|mlockall|munlockall|sched_setparam|sched_getparam|sched_setscheduler|sched_getscheduler|sched_yield|sched_get_priority_max|sched_get_priority_min|sched_rr_get_interval|nanosleep|mremap +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 169, 57, 56), //poll +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 183, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 182, 55, 54), //prctl|rt_sigreturn|rt_sigaction|rt_sigprocmask|rt_sigpending|rt_sigtimedwait|rt_sigqueueinfo|rt_sigsuspend|pread64|pwrite64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 188, 54, 53), //getcwd|capget|capset|sigaltstack|sendfile +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 213, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 199, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 198, 51, 50), //vfork|ugetrlimit|mmap2|truncate64|ftruncate64|stat64|lstat64|fstat64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 212, 50, 49), //getuid32|getgid32|geteuid32|getegid32|setreuid32|setregid32|getgroups32|setgroups32|fchown32|setresuid32|getresuid32|setresgid32|getresgid32 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 217, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 215, 48, 47), //setuid32|setgid32 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 218, 47, 46), //getdents64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 270, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 250, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 224, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 222, 43, 42), //mincore|madvise|fcntl64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 249, 42, 41), //gettid|readahead|setxattr|lsetxattr|fsetxattr|getxattr|lgetxattr|fgetxattr|listxattr|llistxattr|flistxattr|removexattr|lremovexattr|fremovexattr|tkill|sendfile64|futex|sched_setaffinity|sched_getaffinity|io_setup|io_destroy|io_getevents|io_submit|io_cancel|exit_group +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 256, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 254, 40, 39), //epoll_create|epoll_ctl|epoll_wait|remap_file_pages +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 269, 39, 38), //set_tid_address|timer_create|timer_settime|timer_gettime|timer_getoverrun|timer_delete|clock_settime|clock_gettime|clock_getres|clock_nanosleep|statfs64|fstatfs64|tgkill +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 286, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 280, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 271, 36, 35), //arm_fadvise64_64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 285, 35, 34), //waitid|socket|bind|connect|listen +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 290, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 289, 33, 32), //getsockname|getpeername|socketpair +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 291, 32, 31), //sendto +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 348, 15, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 322, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 311, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 309, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 298, 27, 26), //recvfrom|shutdown|setsockopt|getsockopt|sendmsg|recvmsg +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 310, 26, 25), //add_key +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 316, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 312, 24, 23), //keyctl +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 319, 23, 22), //inotify_init|inotify_add_watch|inotify_rm_watch +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 340, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 327, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 326, 20, 19), //openat|mkdirat|mknodat|fchownat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 338, 19, 18), //fstatat64|unlinkat|renameat|linkat|symlinkat|readlinkat|fchmodat|faccessat|pselect6|ppoll|unshare +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 345, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 344, 17, 16), //splice|sync_file_range2|tee|vmsplice +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 347, 16, 15), //getcpu|epoll_pwait +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 379, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 369, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 350, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 349, 12, 11), //utimensat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 367, 11, 10), //timerfd_create|eventfd|fallocate|timerfd_settime|timerfd_gettime|signalfd4|eventfd2|epoll_create1|dup3|pipe2|inotify_init1|preadv|pwritev|rt_tgsigqueueinfo|perf_event_open|recvmmsg|accept4 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 372, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 370, 9, 8), //prlimit64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 378, 8, 7), //clock_adjtime|syncfs|sendmmsg|setns|process_vm_readv|process_vm_writev BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 983042, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 390, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 388, 5, 4), //execveat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 388, 5, 4), //finit_module|sched_setattr|sched_getattr|renameat2|seccomp|getrandom|memfd_create|bpf|execveat BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 394, 4, 3), //mlock2|copy_file_range|preadv2|pwritev2 BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 983045, 1, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 983043, 2, 1), //__ARM_NR_cacheflush diff --git a/libc/seccomp/arm_system_policy.cpp b/libc/seccomp/arm_system_policy.cpp index de6703899..18df03b8f 100644 --- a/libc/seccomp/arm_system_policy.cpp +++ b/libc/seccomp/arm_system_policy.cpp @@ -5,127 +5,125 @@ #include "seccomp_bpfs.h" const sock_filter arm_system_filter[] = { -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 0, 0, 126), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 150, 63, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 0, 0, 124), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 138, 61, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 74, 31, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 41, 15, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 24, 7, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 10, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 8, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 7, 119, 118), //restart_syscall|exit|fork|read|write|open|close -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 9, 118, 117), //creat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 7, 117, 116), //restart_syscall|exit|fork|read|write|open|close +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 9, 116, 115), //creat BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 19, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 13, 116, 115), //unlink|execve|chdir -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 22, 115, 114), //lseek|getpid|mount +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 13, 114, 113), //unlink|execve|chdir +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 22, 113, 112), //lseek|getpid|mount BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 33, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 26, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 25, 112, 111), //getuid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 27, 111, 110), //ptrace +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 25, 110, 109), //getuid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 27, 109, 108), //ptrace BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 36, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 34, 109, 108), //access -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 40, 108, 107), //sync|kill|rename|mkdir +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 34, 107, 106), //access +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 40, 106, 105), //sync|kill|rename|mkdir BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 57, 7, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 51, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 45, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 44, 104, 103), //dup|pipe|times -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 46, 103, 102), //brk +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 44, 102, 101), //dup|pipe|times +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 46, 101, 100), //brk BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 54, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 53, 101, 100), //acct|umount2 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 56, 100, 99), //ioctl|fcntl +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 53, 99, 98), //acct|umount2 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 56, 98, 97), //ioctl|fcntl BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 63, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 60, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 58, 97, 96), //setpgid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 62, 96, 95), //umask|chroot +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 58, 95, 94), //setpgid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 62, 94, 93), //umask|chroot BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 66, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 65, 94, 93), //dup2|getppid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 68, 93, 92), //setsid|sigaction +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 65, 92, 91), //dup2|getppid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 68, 91, 90), //setsid|sigaction BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 114, 15, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 91, 7, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 85, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 77, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 76, 88, 87), //sethostname|setrlimit -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 80, 87, 86), //getrusage|gettimeofday|settimeofday +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 76, 86, 85), //sethostname|setrlimit +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 80, 85, 84), //getrusage|gettimeofday|settimeofday BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 88, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 86, 85, 84), //readlink -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 89, 84, 83), //reboot +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 86, 83, 82), //readlink +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 89, 82, 81), //reboot BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 96, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 94, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 93, 81, 80), //munmap|truncate -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 95, 80, 79), //fchmod +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 93, 79, 78), //munmap|truncate +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 95, 78, 77), //fchmod BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 103, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 98, 78, 77), //getpriority|setpriority -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 106, 77, 76), //syslog|setitimer|getitimer +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 98, 76, 75), //getpriority|setpriority +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 106, 75, 74), //syslog|setitimer|getitimer BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 128, 7, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 118, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 116, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 115, 73, 72), //wait4 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 117, 72, 71), //sysinfo +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 115, 71, 70), //wait4 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 117, 70, 69), //sysinfo BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 124, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 123, 70, 69), //fsync|sigreturn|clone|setdomainname|uname -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 126, 69, 68), //adjtimex|mprotect +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 123, 68, 67), //fsync|sigreturn|clone|setdomainname|uname +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 126, 67, 66), //adjtimex|mprotect BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 136, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 131, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 130, 66, 65), //init_module|delete_module -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 134, 65, 64), //quotactl|getpgid|fchdir -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 138, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 137, 63, 62), //personality -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 149, 62, 61), //setfsuid|setfsgid|_llseek|getdents|_newselect|flock|msync|readv|writev|getsid|fdatasync -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 292, 31, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 219, 15, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 190, 7, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 172, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 168, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 164, 56, 55), //mlock|munlock|mlockall|munlockall|sched_setparam|sched_getparam|sched_setscheduler|sched_getscheduler|sched_yield|sched_get_priority_max|sched_get_priority_min|sched_rr_get_interval|nanosleep|mremap -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 169, 55, 54), //poll -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 183, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 182, 53, 52), //prctl|rt_sigreturn|rt_sigaction|rt_sigprocmask|rt_sigpending|rt_sigtimedwait|rt_sigqueueinfo|rt_sigsuspend|pread64|pwrite64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 188, 52, 51), //getcwd|capget|capset|sigaltstack|sendfile -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 213, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 199, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 198, 49, 48), //vfork|ugetrlimit|mmap2|truncate64|ftruncate64|stat64|lstat64|fstat64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 212, 48, 47), //getuid32|getgid32|geteuid32|getegid32|setreuid32|setregid32|getgroups32|setgroups32|fchown32|setresuid32|getresuid32|setresgid32|getresgid32 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 217, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 215, 46, 45), //setuid32|setgid32 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 218, 45, 44), //getdents64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 270, 7, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 250, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 224, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 222, 41, 40), //mincore|madvise|fcntl64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 249, 40, 39), //gettid|readahead|setxattr|lsetxattr|fsetxattr|getxattr|lgetxattr|fgetxattr|listxattr|llistxattr|flistxattr|removexattr|lremovexattr|fremovexattr|tkill|sendfile64|futex|sched_setaffinity|sched_getaffinity|io_setup|io_destroy|io_getevents|io_submit|io_cancel|exit_group -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 256, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 254, 38, 37), //epoll_create|epoll_ctl|epoll_wait|remap_file_pages -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 269, 37, 36), //set_tid_address|timer_create|timer_settime|timer_gettime|timer_getoverrun|timer_delete|clock_settime|clock_gettime|clock_getres|clock_nanosleep|statfs64|fstatfs64|tgkill -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 286, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 280, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 271, 34, 33), //arm_fadvise64_64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 285, 33, 32), //waitid|socket|bind|connect|listen -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 290, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 289, 31, 30), //getsockname|getpeername|socketpair -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 291, 30, 29), //sendto -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 369, 15, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 340, 7, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 322, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 316, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 298, 25, 24), //recvfrom|shutdown|setsockopt|getsockopt|sendmsg|recvmsg -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 319, 24, 23), //inotify_init|inotify_add_watch|inotify_rm_watch -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 327, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 326, 22, 21), //openat|mkdirat|mknodat|fchownat -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 338, 21, 20), //fstatat64|unlinkat|renameat|linkat|symlinkat|readlinkat|fchmodat|faccessat|pselect6|ppoll|unshare -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 348, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 345, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 344, 18, 17), //splice|sync_file_range2|tee|vmsplice -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 347, 17, 16), //getcpu|epoll_pwait -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 350, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 349, 15, 14), //utimensat -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 367, 14, 13), //timerfd_create|eventfd|fallocate|timerfd_settime|timerfd_gettime|signalfd4|eventfd2|epoll_create1|dup3|pipe2|inotify_init1|preadv|pwritev|rt_tgsigqueueinfo|perf_event_open|recvmmsg|accept4 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 130, 64, 63), //init_module|delete_module +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 134, 63, 62), //quotactl|getpgid|fchdir +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 137, 62, 61), //personality +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 290, 31, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 217, 15, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 183, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 168, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 150, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 149, 56, 55), //setfsuid|setfsgid|_llseek|getdents|_newselect|flock|msync|readv|writev|getsid|fdatasync +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 164, 55, 54), //mlock|munlock|mlockall|munlockall|sched_setparam|sched_getparam|sched_setscheduler|sched_getscheduler|sched_yield|sched_get_priority_max|sched_get_priority_min|sched_rr_get_interval|nanosleep|mremap +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 172, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 169, 53, 52), //poll +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 182, 52, 51), //prctl|rt_sigreturn|rt_sigaction|rt_sigprocmask|rt_sigpending|rt_sigtimedwait|rt_sigqueueinfo|rt_sigsuspend|pread64|pwrite64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 199, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 190, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 188, 49, 48), //getcwd|capget|capset|sigaltstack|sendfile +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 198, 48, 47), //vfork|ugetrlimit|mmap2|truncate64|ftruncate64|stat64|lstat64|fstat64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 213, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 212, 46, 45), //getuid32|getgid32|geteuid32|getegid32|setreuid32|setregid32|getgroups32|setgroups32|fchown32|setresuid32|getresuid32|setresgid32|getresgid32 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 215, 45, 44), //setuid32|setgid32 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 256, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 224, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 219, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 218, 41, 40), //getdents64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 222, 40, 39), //mincore|madvise|fcntl64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 250, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 249, 38, 37), //gettid|readahead|setxattr|lsetxattr|fsetxattr|getxattr|lgetxattr|fgetxattr|listxattr|llistxattr|flistxattr|removexattr|lremovexattr|fremovexattr|tkill|sendfile64|futex|sched_setaffinity|sched_getaffinity|io_setup|io_destroy|io_getevents|io_submit|io_cancel|exit_group +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 254, 37, 36), //epoll_create|epoll_ctl|epoll_wait|remap_file_pages +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 280, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 270, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 269, 34, 33), //set_tid_address|timer_create|timer_settime|timer_gettime|timer_getoverrun|timer_delete|clock_settime|clock_gettime|clock_getres|clock_nanosleep|statfs64|fstatfs64|tgkill +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 271, 33, 32), //arm_fadvise64_64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 286, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 285, 31, 30), //waitid|socket|bind|connect|listen +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 289, 30, 29), //getsockname|getpeername|socketpair +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 350, 15, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 327, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 316, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 292, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 291, 25, 24), //sendto +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 298, 24, 23), //recvfrom|shutdown|setsockopt|getsockopt|sendmsg|recvmsg +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 322, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 319, 22, 21), //inotify_init|inotify_add_watch|inotify_rm_watch +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 326, 21, 20), //openat|mkdirat|mknodat|fchownat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 345, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 340, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 338, 18, 17), //fstatat64|unlinkat|renameat|linkat|symlinkat|readlinkat|fchmodat|faccessat|pselect6|ppoll|unshare +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 344, 17, 16), //splice|sync_file_range2|tee|vmsplice +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 348, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 347, 15, 14), //getcpu|epoll_pwait +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 349, 14, 13), //utimensat BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 390, 7, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 380, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 372, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 370, 10, 9), //prlimit64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 378, 9, 8), //clock_adjtime|syncfs|sendmmsg|setns|process_vm_readv|process_vm_writev -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 387, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 386, 7, 6), //sched_setattr|sched_getattr|renameat2|seccomp|getrandom|memfd_create -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 388, 6, 5), //execveat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 372, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 369, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 367, 10, 9), //timerfd_create|eventfd|fallocate|timerfd_settime|timerfd_gettime|signalfd4|eventfd2|epoll_create1|dup3|pipe2|inotify_init1|preadv|pwritev|rt_tgsigqueueinfo|perf_event_open|recvmmsg|accept4 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 370, 9, 8), //prlimit64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 380, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 378, 7, 6), //clock_adjtime|syncfs|sendmmsg|setns|process_vm_readv|process_vm_writev +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 388, 6, 5), //sched_setattr|sched_getattr|renameat2|seccomp|getrandom|memfd_create|bpf|execveat BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 983045, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 983042, 1, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 394, 3, 2), //mlock2|copy_file_range|preadv2|pwritev2 diff --git a/libc/seccomp/include/seccomp_policy.h b/libc/seccomp/include/seccomp_policy.h index ed1901b10..add17b96c 100644 --- a/libc/seccomp/include/seccomp_policy.h +++ b/libc/seccomp/include/seccomp_policy.h @@ -20,9 +20,6 @@ #include <stddef.h> #include <linux/filter.h> -// TODO(victorhsieh): remove once the callers are switched to the new API. -bool set_seccomp_filter(); - bool set_app_seccomp_filter(); bool set_system_seccomp_filter(); bool set_global_seccomp_filter(); diff --git a/libc/seccomp/mips64_app_policy.cpp b/libc/seccomp/mips64_app_policy.cpp index 27bb0fa17..6ff4d9ac9 100644 --- a/libc/seccomp/mips64_app_policy.cpp +++ b/libc/seccomp/mips64_app_policy.cpp @@ -5,88 +5,104 @@ #include "seccomp_bpfs.h" const sock_filter mips64_app_filter[] = { -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5000, 0, 84), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5164, 41, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5077, 21, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5034, 11, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5008, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5000, 0, 100), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5137, 49, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5091, 25, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5038, 13, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5023, 7, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5005, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5003, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5002, 77, 76), //read|write -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5004, 76, 75), //close -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5006, 75, 74), //fstat -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5031, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5023, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5020, 72, 71), //lseek|mmap|mprotect|munmap|brk|rt_sigaction|rt_sigprocmask|ioctl|pread64|pwrite64|readv|writev -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5028, 71, 70), //sched_yield|mremap|msync|mincore|madvise -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5032, 70, 69), //dup -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5057, 5, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5043, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5038, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5037, 66, 65), //nanosleep|getitimer|setitimer -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5042, 65, 64), //getpid|sendfile|socket|connect -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5056, 64, 63), //sendto|recvfrom|sendmsg|recvmsg|shutdown|bind|listen|getsockname|getpeername|socketpair|setsockopt|getsockopt|clone -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5070, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5062, 62, 61), //execve|exit|wait4|kill|uname -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5076, 61, 60), //fcntl|flock|fsync|fdatasync|truncate|ftruncate -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5132, 9, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5093, 5, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5091, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5089, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5080, 56, 55), //getcwd|chdir|fchdir -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5090, 55, 54), //fchmod -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5092, 54, 53), //fchown +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5002, 93, 92), //read|write +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5004, 92, 91), //close +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5008, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5006, 90, 89), //fstat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5020, 89, 88), //lseek|mmap|mprotect|munmap|brk|rt_sigaction|rt_sigprocmask|ioctl|pread64|pwrite64|readv|writev +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5034, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5031, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5028, 86, 85), //sched_yield|mremap|msync|mincore|madvise +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5032, 85, 84), //dup +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5037, 84, 83), //nanosleep|getitimer|setitimer +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5070, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5057, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5043, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5042, 80, 79), //getpid|sendfile|socket|connect +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5056, 79, 78), //sendto|recvfrom|sendmsg|recvmsg|shutdown|bind|listen|getsockname|getpeername|socketpair|setsockopt|getsockopt|clone +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5062, 78, 77), //execve|exit|wait4|kill|uname +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5089, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5077, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5076, 75, 74), //fcntl|flock|fsync|fdatasync|truncate|ftruncate +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5080, 74, 73), //getcwd|chdir|fchdir +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5090, 73, 72), //fchmod +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5116, 11, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5105, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5102, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5093, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5092, 68, 67), //fchown +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5101, 67, 66), //umask|gettimeofday|getrlimit|getrusage|sysinfo|times|ptrace|getuid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5103, 66, 65), //getgid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5112, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5110, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5109, 52, 51), //umask|gettimeofday|getrlimit|getrusage|sysinfo|times|ptrace|getuid|syslog|getgid|setuid|setgid|geteuid|getegid|setpgid|getppid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5130, 51, 50), //setsid|setreuid|setregid|getgroups|setgroups|setresuid|getresuid|setresgid|getresgid|getpgid|setfsuid|setfsgid|getsid|capget|capset|rt_sigpending|rt_sigtimedwait|rt_sigqueueinfo|rt_sigsuspend|sigaltstack -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5151, 5, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5137, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5134, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5133, 47, 46), //personality -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5136, 46, 45), //statfs|fstatfs -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5150, 45, 44), //getpriority|setpriority|sched_setparam|sched_getparam|sched_setscheduler|sched_getscheduler|sched_get_priority_max|sched_get_priority_min|sched_rr_get_interval|mlock|munlock|mlockall|munlockall -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5153, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5109, 63, 62), //geteuid|getegid|setpgid|getppid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5111, 62, 61), //setsid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5114, 61, 60), //setregid|getgroups +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5125, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5122, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5118, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5117, 57, 56), //getresuid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5120, 56, 55), //getresgid|getpgid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5124, 55, 54), //getsid|capget +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5134, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5132, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5130, 52, 51), //rt_sigpending|rt_sigtimedwait|rt_sigqueueinfo|rt_sigsuspend|sigaltstack +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5133, 51, 50), //personality +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5136, 50, 49), //statfs|fstatfs +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5237, 25, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5194, 13, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5157, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5153, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5151, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5150, 44, 43), //getpriority|setpriority|sched_setparam|sched_getparam|sched_setscheduler|sched_getscheduler|sched_get_priority_max|sched_get_priority_min|sched_rr_get_interval|mlock|munlock|mlockall|munlockall BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5152, 43, 42), //pivot_root -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5162, 42, 41), //prctl|adjtimex|setrlimit|chroot|sync|acct|settimeofday|mount|umount2 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5244, 21, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5208, 11, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5178, 5, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5172, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5168, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5167, 36, 35), //reboot|sethostname|setdomainname -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5170, 35, 34), //init_module|delete_module -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5173, 34, 33), //quotactl -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5200, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5194, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5193, 31, 30), //gettid|readahead|setxattr|lsetxattr|fsetxattr|getxattr|lgetxattr|fgetxattr|listxattr|llistxattr|flistxattr|removexattr|lremovexattr|fremovexattr|tkill -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5198, 30, 29), //futex|sched_setaffinity|sched_getaffinity|cacheflush -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5206, 29, 28), //io_setup|io_destroy|io_getevents|io_submit|io_cancel|exit_group -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5237, 5, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5215, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5211, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5209, 25, 24), //epoll_ctl -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5214, 24, 23), //rt_sigreturn|set_tid_address|restart_syscall -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5226, 23, 22), //fadvise64|timer_create|timer_settime|timer_gettime|timer_getoverrun|timer_delete|clock_settime|clock_gettime|clock_getres|clock_nanosleep|tgkill +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5155, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5154, 41, 40), //prctl +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5156, 40, 39), //setrlimit +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5178, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5172, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5158, 37, 36), //sync +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5173, 36, 35), //quotactl +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5193, 35, 34), //gettid|readahead|setxattr|lsetxattr|fsetxattr|getxattr|lgetxattr|fgetxattr|listxattr|llistxattr|flistxattr|removexattr|lremovexattr|fremovexattr|tkill +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5211, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5208, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5200, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5198, 31, 30), //futex|sched_setaffinity|sched_getaffinity|cacheflush +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5206, 30, 29), //io_setup|io_destroy|io_getevents|io_submit|io_cancel|exit_group +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5209, 29, 28), //epoll_ctl +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5222, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5215, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5214, 26, 25), //rt_sigreturn|set_tid_address|restart_syscall +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5221, 25, 24), //fadvise64|timer_create|timer_settime|timer_gettime|timer_getoverrun|timer_delete +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5226, 24, 23), //clock_gettime|clock_getres|clock_nanosleep|tgkill +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5279, 11, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5247, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5244, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5242, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5238, 21, 20), //waitid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5243, 20, 19), //set_thread_area -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5297, 9, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5271, 5, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5252, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5247, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5246, 15, 14), //inotify_add_watch|inotify_rm_watch +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5238, 19, 18), //waitid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5243, 18, 17), //set_thread_area +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5246, 17, 16), //inotify_add_watch|inotify_rm_watch +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5271, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5252, 1, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5251, 14, 13), //openat|mkdirat|mknodat|fchownat BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5267, 13, 12), //newfstatat|unlinkat|renameat|linkat|symlinkat|readlinkat|fchmodat|faccessat|pselect6|ppoll|unshare|splice|sync_file_range|tee|vmsplice -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5279, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5276, 11, 10), //getcpu|epoll_pwait|ioprio_set|ioprio_get|utimensat -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5295, 10, 9), //fallocate|timerfd_create|timerfd_gettime|timerfd_settime|signalfd4|eventfd2|epoll_create1|dup3|pipe2|inotify_init1|preadv|pwritev|rt_tgsigqueueinfo|perf_event_open|accept4|recvmmsg -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5316, 5, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5308, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5300, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5298, 6, 5), //prlimit64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5306, 5, 4), //clock_adjtime|syncfs|sendmmsg|setns|process_vm_readv|process_vm_writev -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5315, 4, 3), //getdents64|sched_setattr|sched_getattr|renameat2|seccomp|getrandom|memfd_create -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5319, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5276, 12, 11), //getcpu|epoll_pwait|ioprio_set|ioprio_get|utimensat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5308, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5301, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5297, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5295, 8, 7), //fallocate|timerfd_create|timerfd_gettime|timerfd_settime|signalfd4|eventfd2|epoll_create1|dup3|pipe2|inotify_init1|preadv|pwritev|rt_tgsigqueueinfo|perf_event_open|accept4|recvmmsg +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5298, 7, 6), //prlimit64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5306, 6, 5), //syncfs|sendmmsg|setns|process_vm_readv|process_vm_writev +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5319, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5316, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5315, 3, 2), //getdents64|sched_setattr|sched_getattr|renameat2|seccomp|getrandom|memfd_create BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5317, 2, 1), //execveat BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5323, 1, 0), //mlock2|copy_file_range|preadv2|pwritev2 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), diff --git a/libc/seccomp/mips64_global_policy.cpp b/libc/seccomp/mips64_global_policy.cpp index 04c13b312..1084f7b0d 100644 --- a/libc/seccomp/mips64_global_policy.cpp +++ b/libc/seccomp/mips64_global_policy.cpp @@ -5,91 +5,89 @@ #include "seccomp_bpfs.h" const sock_filter mips64_global_filter[] = { -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5000, 0, 86), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5168, 43, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5000, 0, 84), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5164, 41, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5077, 21, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5034, 11, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5008, 5, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5005, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5003, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5002, 79, 78), //read|write -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5004, 78, 77), //close -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5006, 77, 76), //fstat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5002, 77, 76), //read|write +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5004, 76, 75), //close +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5006, 75, 74), //fstat BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5031, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5023, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5020, 74, 73), //lseek|mmap|mprotect|munmap|brk|rt_sigaction|rt_sigprocmask|ioctl|pread64|pwrite64|readv|writev -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5028, 73, 72), //sched_yield|mremap|msync|mincore|madvise -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5032, 72, 71), //dup +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5020, 72, 71), //lseek|mmap|mprotect|munmap|brk|rt_sigaction|rt_sigprocmask|ioctl|pread64|pwrite64|readv|writev +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5028, 71, 70), //sched_yield|mremap|msync|mincore|madvise +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5032, 70, 69), //dup BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5057, 5, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5043, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5038, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5037, 68, 67), //nanosleep|getitimer|setitimer -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5042, 67, 66), //getpid|sendfile|socket|connect -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5056, 66, 65), //sendto|recvfrom|sendmsg|recvmsg|shutdown|bind|listen|getsockname|getpeername|socketpair|setsockopt|getsockopt|clone +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5037, 66, 65), //nanosleep|getitimer|setitimer +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5042, 65, 64), //getpid|sendfile|socket|connect +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5056, 64, 63), //sendto|recvfrom|sendmsg|recvmsg|shutdown|bind|listen|getsockname|getpeername|socketpair|setsockopt|getsockopt|clone BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5070, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5062, 64, 63), //execve|exit|wait4|kill|uname -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5076, 63, 62), //fcntl|flock|fsync|fdatasync|truncate|ftruncate -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5134, 11, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5062, 62, 61), //execve|exit|wait4|kill|uname +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5076, 61, 60), //fcntl|flock|fsync|fdatasync|truncate|ftruncate +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5132, 9, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5093, 5, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5091, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5089, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5080, 58, 57), //getcwd|chdir|fchdir -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5090, 57, 56), //fchmod -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5092, 56, 55), //fchown -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5132, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5080, 56, 55), //getcwd|chdir|fchdir +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5090, 55, 54), //fchmod +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5092, 54, 53), //fchown BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5110, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5109, 53, 52), //umask|gettimeofday|getrlimit|getrusage|sysinfo|times|ptrace|getuid|syslog|getgid|setuid|setgid|geteuid|getegid|setpgid|getppid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5130, 52, 51), //setsid|setreuid|setregid|getgroups|setgroups|setresuid|getresuid|setresgid|getresgid|getpgid|setfsuid|setfsgid|getsid|capget|capset|rt_sigpending|rt_sigtimedwait|rt_sigqueueinfo|rt_sigsuspend|sigaltstack -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5133, 51, 50), //personality -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5153, 5, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5151, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5137, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5136, 47, 46), //statfs|fstatfs -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5150, 46, 45), //getpriority|setpriority|sched_setparam|sched_getparam|sched_setscheduler|sched_getscheduler|sched_get_priority_max|sched_get_priority_min|sched_rr_get_interval|mlock|munlock|mlockall|munlockall -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5152, 45, 44), //pivot_root -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5164, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5163, 43, 42), //prctl|adjtimex|setrlimit|chroot|sync|acct|settimeofday|mount|umount2|swapon -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5167, 42, 41), //reboot|sethostname|setdomainname -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5244, 21, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5211, 11, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5194, 5, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5178, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5172, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5170, 36, 35), //init_module|delete_module -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5173, 35, 34), //quotactl -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5193, 34, 33), //gettid|readahead|setxattr|lsetxattr|fsetxattr|getxattr|lgetxattr|fgetxattr|listxattr|llistxattr|flistxattr|removexattr|lremovexattr|fremovexattr|tkill -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5208, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5200, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5198, 31, 30), //futex|sched_setaffinity|sched_getaffinity|cacheflush -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5206, 30, 29), //io_setup|io_destroy|io_getevents|io_submit|io_cancel|exit_group -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5209, 29, 28), //epoll_ctl -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5239, 5, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5237, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5215, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5214, 25, 24), //rt_sigreturn|set_tid_address|restart_syscall -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5226, 24, 23), //fadvise64|timer_create|timer_settime|timer_gettime|timer_getoverrun|timer_delete|clock_settime|clock_gettime|clock_getres|clock_nanosleep|tgkill -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5238, 23, 22), //waitid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5241, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5240, 21, 20), //add_key -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5243, 20, 19), //keyctl|set_thread_area -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5297, 9, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5271, 5, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5252, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5247, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5246, 15, 14), //inotify_add_watch|inotify_rm_watch -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5251, 14, 13), //openat|mkdirat|mknodat|fchownat -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5267, 13, 12), //newfstatat|unlinkat|renameat|linkat|symlinkat|readlinkat|fchmodat|faccessat|pselect6|ppoll|unshare|splice|sync_file_range|tee|vmsplice -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5279, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5276, 11, 10), //getcpu|epoll_pwait|ioprio_set|ioprio_get|utimensat -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5295, 10, 9), //fallocate|timerfd_create|timerfd_gettime|timerfd_settime|signalfd4|eventfd2|epoll_create1|dup3|pipe2|inotify_init1|preadv|pwritev|rt_tgsigqueueinfo|perf_event_open|accept4|recvmmsg -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5316, 5, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5307, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5300, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5298, 6, 5), //prlimit64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5306, 5, 4), //clock_adjtime|syncfs|sendmmsg|setns|process_vm_readv|process_vm_writev -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5315, 4, 3), //finit_module|getdents64|sched_setattr|sched_getattr|renameat2|seccomp|getrandom|memfd_create +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5109, 52, 51), //umask|gettimeofday|getrlimit|getrusage|sysinfo|times|ptrace|getuid|syslog|getgid|setuid|setgid|geteuid|getegid|setpgid|getppid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5130, 51, 50), //setsid|setreuid|setregid|getgroups|setgroups|setresuid|getresuid|setresgid|getresgid|getpgid|setfsuid|setfsgid|getsid|capget|capset|rt_sigpending|rt_sigtimedwait|rt_sigqueueinfo|rt_sigsuspend|sigaltstack +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5151, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5137, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5134, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5133, 47, 46), //personality +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5136, 46, 45), //statfs|fstatfs +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5150, 45, 44), //getpriority|setpriority|sched_setparam|sched_getparam|sched_setscheduler|sched_getscheduler|sched_get_priority_max|sched_get_priority_min|sched_rr_get_interval|mlock|munlock|mlockall|munlockall +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5153, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5152, 43, 42), //pivot_root +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5163, 42, 41), //prctl|adjtimex|setrlimit|chroot|sync|acct|settimeofday|mount|umount2|swapon +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5241, 21, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5208, 11, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5178, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5172, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5168, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5167, 36, 35), //reboot|sethostname|setdomainname +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5170, 35, 34), //init_module|delete_module +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5173, 34, 33), //quotactl +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5200, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5194, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5193, 31, 30), //gettid|readahead|setxattr|lsetxattr|fsetxattr|getxattr|lgetxattr|fgetxattr|listxattr|llistxattr|flistxattr|removexattr|lremovexattr|fremovexattr|tkill +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5198, 30, 29), //futex|sched_setaffinity|sched_getaffinity|cacheflush +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5206, 29, 28), //io_setup|io_destroy|io_getevents|io_submit|io_cancel|exit_group +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5237, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5215, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5211, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5209, 25, 24), //epoll_ctl +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5214, 24, 23), //rt_sigreturn|set_tid_address|restart_syscall +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5226, 23, 22), //fadvise64|timer_create|timer_settime|timer_gettime|timer_getoverrun|timer_delete|clock_settime|clock_gettime|clock_getres|clock_nanosleep|tgkill +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5239, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5238, 21, 20), //waitid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5240, 20, 19), //add_key +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5279, 9, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5252, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5247, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5244, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5243, 15, 14), //keyctl|set_thread_area +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5246, 14, 13), //inotify_add_watch|inotify_rm_watch +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5251, 13, 12), //openat|mkdirat|mknodat|fchownat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5271, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5267, 11, 10), //newfstatat|unlinkat|renameat|linkat|symlinkat|readlinkat|fchmodat|faccessat|pselect6|ppoll|unshare|splice|sync_file_range|tee|vmsplice +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5276, 10, 9), //getcpu|epoll_pwait|ioprio_set|ioprio_get|utimensat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5307, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5300, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5297, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5295, 6, 5), //fallocate|timerfd_create|timerfd_gettime|timerfd_settime|signalfd4|eventfd2|epoll_create1|dup3|pipe2|inotify_init1|preadv|pwritev|rt_tgsigqueueinfo|perf_event_open|accept4|recvmmsg +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5298, 5, 4), //prlimit64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5306, 4, 3), //clock_adjtime|syncfs|sendmmsg|setns|process_vm_readv|process_vm_writev BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5319, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5317, 2, 1), //execveat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5317, 2, 1), //finit_module|getdents64|sched_setattr|sched_getattr|renameat2|seccomp|getrandom|memfd_create|bpf|execveat BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5323, 1, 0), //mlock2|copy_file_range|preadv2|pwritev2 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), }; diff --git a/libc/seccomp/mips64_system_policy.cpp b/libc/seccomp/mips64_system_policy.cpp index 8f34d417c..6b76244ad 100644 --- a/libc/seccomp/mips64_system_policy.cpp +++ b/libc/seccomp/mips64_system_policy.cpp @@ -5,89 +5,87 @@ #include "seccomp_bpfs.h" const sock_filter mips64_system_filter[] = { -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5000, 0, 84), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5000, 0, 82), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5164, 41, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5077, 21, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5034, 11, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5008, 5, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5005, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5003, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5002, 77, 76), //read|write -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5004, 76, 75), //close -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5006, 75, 74), //fstat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5002, 75, 74), //read|write +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5004, 74, 73), //close +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5006, 73, 72), //fstat BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5031, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5023, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5020, 72, 71), //lseek|mmap|mprotect|munmap|brk|rt_sigaction|rt_sigprocmask|ioctl|pread64|pwrite64|readv|writev -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5028, 71, 70), //sched_yield|mremap|msync|mincore|madvise -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5032, 70, 69), //dup +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5020, 70, 69), //lseek|mmap|mprotect|munmap|brk|rt_sigaction|rt_sigprocmask|ioctl|pread64|pwrite64|readv|writev +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5028, 69, 68), //sched_yield|mremap|msync|mincore|madvise +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5032, 68, 67), //dup BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5057, 5, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5043, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5038, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5037, 66, 65), //nanosleep|getitimer|setitimer -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5042, 65, 64), //getpid|sendfile|socket|connect -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5056, 64, 63), //sendto|recvfrom|sendmsg|recvmsg|shutdown|bind|listen|getsockname|getpeername|socketpair|setsockopt|getsockopt|clone +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5037, 64, 63), //nanosleep|getitimer|setitimer +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5042, 63, 62), //getpid|sendfile|socket|connect +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5056, 62, 61), //sendto|recvfrom|sendmsg|recvmsg|shutdown|bind|listen|getsockname|getpeername|socketpair|setsockopt|getsockopt|clone BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5070, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5062, 62, 61), //execve|exit|wait4|kill|uname -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5076, 61, 60), //fcntl|flock|fsync|fdatasync|truncate|ftruncate +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5062, 60, 59), //execve|exit|wait4|kill|uname +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5076, 59, 58), //fcntl|flock|fsync|fdatasync|truncate|ftruncate BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5132, 9, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5093, 5, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5091, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5089, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5080, 56, 55), //getcwd|chdir|fchdir -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5090, 55, 54), //fchmod -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5092, 54, 53), //fchown +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5080, 54, 53), //getcwd|chdir|fchdir +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5090, 53, 52), //fchmod +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5092, 52, 51), //fchown BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5110, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5109, 52, 51), //umask|gettimeofday|getrlimit|getrusage|sysinfo|times|ptrace|getuid|syslog|getgid|setuid|setgid|geteuid|getegid|setpgid|getppid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5130, 51, 50), //setsid|setreuid|setregid|getgroups|setgroups|setresuid|getresuid|setresgid|getresgid|getpgid|setfsuid|setfsgid|getsid|capget|capset|rt_sigpending|rt_sigtimedwait|rt_sigqueueinfo|rt_sigsuspend|sigaltstack +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5109, 50, 49), //umask|gettimeofday|getrlimit|getrusage|sysinfo|times|ptrace|getuid|syslog|getgid|setuid|setgid|geteuid|getegid|setpgid|getppid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5130, 49, 48), //setsid|setreuid|setregid|getgroups|setgroups|setresuid|getresuid|setresgid|getresgid|getpgid|setfsuid|setfsgid|getsid|capget|capset|rt_sigpending|rt_sigtimedwait|rt_sigqueueinfo|rt_sigsuspend|sigaltstack BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5151, 5, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5137, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5134, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5133, 47, 46), //personality -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5136, 46, 45), //statfs|fstatfs -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5150, 45, 44), //getpriority|setpriority|sched_setparam|sched_getparam|sched_setscheduler|sched_getscheduler|sched_get_priority_max|sched_get_priority_min|sched_rr_get_interval|mlock|munlock|mlockall|munlockall +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5133, 45, 44), //personality +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5136, 44, 43), //statfs|fstatfs +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5150, 43, 42), //getpriority|setpriority|sched_setparam|sched_getparam|sched_setscheduler|sched_getscheduler|sched_get_priority_max|sched_get_priority_min|sched_rr_get_interval|mlock|munlock|mlockall|munlockall BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5153, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5152, 43, 42), //pivot_root -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5162, 42, 41), //prctl|adjtimex|setrlimit|chroot|sync|acct|settimeofday|mount|umount2 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5244, 21, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5208, 11, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5152, 41, 40), //pivot_root +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5162, 40, 39), //prctl|adjtimex|setrlimit|chroot|sync|acct|settimeofday|mount|umount2 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5242, 19, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5200, 9, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5178, 5, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5172, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5168, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5167, 36, 35), //reboot|sethostname|setdomainname -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5170, 35, 34), //init_module|delete_module -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5173, 34, 33), //quotactl -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5200, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5167, 34, 33), //reboot|sethostname|setdomainname +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5170, 33, 32), //init_module|delete_module +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5173, 32, 31), //quotactl BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5194, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5193, 31, 30), //gettid|readahead|setxattr|lsetxattr|fsetxattr|getxattr|lgetxattr|fgetxattr|listxattr|llistxattr|flistxattr|removexattr|lremovexattr|fremovexattr|tkill -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5198, 30, 29), //futex|sched_setaffinity|sched_getaffinity|cacheflush -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5206, 29, 28), //io_setup|io_destroy|io_getevents|io_submit|io_cancel|exit_group -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5237, 5, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5215, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5211, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5209, 25, 24), //epoll_ctl -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5214, 24, 23), //rt_sigreturn|set_tid_address|restart_syscall -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5226, 23, 22), //fadvise64|timer_create|timer_settime|timer_gettime|timer_getoverrun|timer_delete|clock_settime|clock_gettime|clock_getres|clock_nanosleep|tgkill -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5242, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5238, 21, 20), //waitid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5243, 20, 19), //set_thread_area -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5297, 9, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5271, 5, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5252, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5247, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5246, 15, 14), //inotify_add_watch|inotify_rm_watch -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5251, 14, 13), //openat|mkdirat|mknodat|fchownat -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5267, 13, 12), //newfstatat|unlinkat|renameat|linkat|symlinkat|readlinkat|fchmodat|faccessat|pselect6|ppoll|unshare|splice|sync_file_range|tee|vmsplice -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5279, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5276, 11, 10), //getcpu|epoll_pwait|ioprio_set|ioprio_get|utimensat -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5295, 10, 9), //fallocate|timerfd_create|timerfd_gettime|timerfd_settime|signalfd4|eventfd2|epoll_create1|dup3|pipe2|inotify_init1|preadv|pwritev|rt_tgsigqueueinfo|perf_event_open|accept4|recvmmsg -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5316, 5, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5308, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5300, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5298, 6, 5), //prlimit64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5306, 5, 4), //clock_adjtime|syncfs|sendmmsg|setns|process_vm_readv|process_vm_writev -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5315, 4, 3), //getdents64|sched_setattr|sched_getattr|renameat2|seccomp|getrandom|memfd_create +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5193, 30, 29), //gettid|readahead|setxattr|lsetxattr|fsetxattr|getxattr|lgetxattr|fgetxattr|listxattr|llistxattr|flistxattr|removexattr|lremovexattr|fremovexattr|tkill +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5198, 29, 28), //futex|sched_setaffinity|sched_getaffinity|cacheflush +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5215, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5211, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5208, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5206, 25, 24), //io_setup|io_destroy|io_getevents|io_submit|io_cancel|exit_group +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5209, 24, 23), //epoll_ctl +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5214, 23, 22), //rt_sigreturn|set_tid_address|restart_syscall +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5237, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5226, 21, 20), //fadvise64|timer_create|timer_settime|timer_gettime|timer_getoverrun|timer_delete|clock_settime|clock_gettime|clock_getres|clock_nanosleep|tgkill +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5238, 20, 19), //waitid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5279, 9, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5252, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5247, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5244, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5243, 15, 14), //set_thread_area +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5246, 14, 13), //inotify_add_watch|inotify_rm_watch +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5251, 13, 12), //openat|mkdirat|mknodat|fchownat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5271, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5267, 11, 10), //newfstatat|unlinkat|renameat|linkat|symlinkat|readlinkat|fchmodat|faccessat|pselect6|ppoll|unshare|splice|sync_file_range|tee|vmsplice +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5276, 10, 9), //getcpu|epoll_pwait|ioprio_set|ioprio_get|utimensat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5308, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5300, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5297, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5295, 6, 5), //fallocate|timerfd_create|timerfd_gettime|timerfd_settime|signalfd4|eventfd2|epoll_create1|dup3|pipe2|inotify_init1|preadv|pwritev|rt_tgsigqueueinfo|perf_event_open|accept4|recvmmsg +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5298, 5, 4), //prlimit64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5306, 4, 3), //clock_adjtime|syncfs|sendmmsg|setns|process_vm_readv|process_vm_writev BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5319, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5317, 2, 1), //execveat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5317, 2, 1), //getdents64|sched_setattr|sched_getattr|renameat2|seccomp|getrandom|memfd_create|bpf|execveat BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5323, 1, 0), //mlock2|copy_file_range|preadv2|pwritev2 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), }; diff --git a/libc/seccomp/mips_app_policy.cpp b/libc/seccomp/mips_app_policy.cpp index abda7eb1c..bc1a924be 100644 --- a/libc/seccomp/mips_app_policy.cpp +++ b/libc/seccomp/mips_app_policy.cpp @@ -5,111 +5,119 @@ #include "seccomp_bpfs.h" const sock_filter mips_app_filter[] = { -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4001, 0, 110), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4131, 55, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4063, 27, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4036, 13, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4023, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4001, 0, 118), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4136, 59, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4063, 29, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4041, 15, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4024, 7, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4010, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4008, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4007, 103, 102), //exit|fork|read|write|open|close -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4009, 102, 101), //creat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4007, 111, 110), //exit|fork|read|write|open|close +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4009, 110, 109), //creat BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4019, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4013, 100, 99), //unlink|execve|chdir -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4022, 99, 98), //lseek|getpid|mount +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4013, 108, 107), //unlink|execve|chdir +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4021, 107, 106), //lseek|getpid BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4033, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4026, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4025, 96, 95), //setuid|getuid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4027, 95, 94), //ptrace -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4034, 94, 93), //access +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4025, 104, 103), //getuid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4027, 103, 102), //ptrace +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4036, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4034, 101, 100), //access +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4040, 100, 99), //sync|kill|rename|mkdir BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4054, 7, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4045, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4041, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4040, 90, 89), //sync|kill|rename|mkdir -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4044, 89, 88), //dup|pipe|times +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4047, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4045, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4044, 96, 95), //dup|pipe|times +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4046, 95, 94), //brk BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4049, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4048, 87, 86), //brk|setgid|getgid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4053, 86, 85), //geteuid|getegid|acct|umount2 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4048, 93, 92), //getgid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4051, 92, 91), //geteuid|getegid BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4060, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4057, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4056, 83, 82), //ioctl|fcntl -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4058, 82, 81), //setpgid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4062, 81, 80), //umask|chroot -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4094, 13, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4085, 7, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4070, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4056, 89, 88), //ioctl|fcntl +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4058, 88, 87), //setpgid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4061, 87, 86), //umask +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4104, 15, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4080, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4071, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4066, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4065, 76, 75), //dup2|getppid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4068, 75, 74), //setsid|sigaction -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4074, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4072, 73, 72), //setreuid|setregid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4082, 72, 71), //sethostname|setrlimit|getrlimit|getrusage|gettimeofday|settimeofday|getgroups|setgroups +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4065, 82, 81), //dup2|getppid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4068, 81, 80), //setsid|sigaction +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4075, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4072, 79, 78), //setregid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4079, 78, 77), //setrlimit|getrlimit|getrusage|gettimeofday BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4090, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4088, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4086, 69, 68), //readlink -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4089, 68, 67), //reboot -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4093, 67, 66), //mmap|munmap|truncate -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4118, 7, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4114, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4103, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4098, 63, 62), //fchmod|fchown|getpriority|setpriority -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4106, 62, 61), //syslog|setitimer|getitimer -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4116, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4115, 60, 59), //wait4 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4117, 59, 58), //sysinfo -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4128, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4124, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4123, 56, 55), //fsync|sigreturn|clone|setdomainname|uname -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4126, 55, 54), //adjtimex|mprotect -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4130, 54, 53), //init_module|delete_module -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4248, 27, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4179, 13, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4154, 7, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4138, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4136, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4134, 48, 47), //quotactl|getpgid|fchdir -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4137, 47, 46), //personality -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4151, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4148, 45, 44), //setfsuid|setfsgid|_llseek|getdents|_newselect|flock|msync|readv|writev|cacheflush -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4153, 44, 43), //getsid|fdatasync -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4176, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4169, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4168, 41, 40), //mlock|munlock|mlockall|munlockall|sched_setparam|sched_getparam|sched_setscheduler|sched_getscheduler|sched_yield|sched_get_priority_max|sched_get_priority_min|sched_rr_get_interval|nanosleep|mremap -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4175, 40, 39), //bind|connect|getpeername|getsockname|getsockopt|listen -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4178, 39, 38), //recvfrom|recvmsg +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4085, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4081, 75, 74), //getgroups +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4086, 74, 73), //readlink +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4094, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4093, 72, 71), //mmap|munmap|truncate +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4098, 71, 70), //fchmod|fchown|getpriority|setpriority +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4122, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4116, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4114, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4106, 67, 66), //setitimer|getitimer +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4115, 66, 65), //wait4 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4118, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4117, 64, 63), //sysinfo +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4121, 63, 62), //fsync|sigreturn|clone +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4131, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4125, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4123, 60, 59), //uname +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4126, 59, 58), //mprotect +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4134, 58, 57), //quotactl|getpgid|fchdir +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4248, 29, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4188, 15, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4169, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4151, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4140, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4137, 52, 51), //personality +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4148, 51, 50), //_llseek|getdents|_newselect|flock|msync|readv|writev|cacheflush +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4154, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4153, 49, 48), //getsid|fdatasync +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4168, 48, 47), //mlock|munlock|mlockall|munlockall|sched_setparam|sched_getparam|sched_setscheduler|sched_getscheduler|sched_yield|sched_get_priority_max|sched_get_priority_min|sched_rr_get_interval|nanosleep|mremap +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4179, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4176, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4175, 45, 44), //bind|connect|getpeername|getsockname|getsockopt|listen +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4178, 44, 43), //recvfrom|recvmsg +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4186, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4185, 42, 41), //sendmsg|sendto|setsockopt|shutdown|socket|socketpair +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4187, 41, 40), //getresuid BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4210, 7, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4190, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4188, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4187, 35, 34), //sendmsg|sendto|setsockopt|shutdown|socket|socketpair|setresuid|getresuid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4189, 34, 33), //poll -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4203, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4202, 32, 31), //setresgid|getresgid|prctl|rt_sigreturn|rt_sigaction|rt_sigprocmask|rt_sigpending|rt_sigtimedwait|rt_sigqueueinfo|rt_sigsuspend|pread64|pwrite64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4208, 31, 30), //getcwd|capget|capset|sigaltstack|sendfile +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4203, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4191, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4189, 37, 36), //poll +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4202, 36, 35), //getresgid|prctl|rt_sigreturn|rt_sigaction|rt_sigprocmask|rt_sigpending|rt_sigtimedwait|rt_sigqueueinfo|rt_sigsuspend|pread64|pwrite64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4206, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4205, 34, 33), //getcwd|capget +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4208, 33, 32), //sigaltstack|sendfile BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4222, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4217, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4216, 28, 27), //mmap2|truncate64|ftruncate64|stat64|lstat64|fstat64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4221, 27, 26), //mincore|madvise|getdents64|fcntl64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4247, 26, 25), //gettid|readahead|setxattr|lsetxattr|fsetxattr|getxattr|lgetxattr|fgetxattr|listxattr|llistxattr|flistxattr|removexattr|lremovexattr|fremovexattr|tkill|sendfile64|futex|sched_setaffinity|sched_getaffinity|io_setup|io_destroy|io_getevents|io_submit|io_cancel|exit_group -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4319, 13, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4293, 7, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4283, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4278, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4267, 21, 20), //epoll_create|epoll_ctl|epoll_wait|remap_file_pages|set_tid_address|restart_syscall|fadvise64|statfs64|fstatfs64|timer_create|timer_settime|timer_gettime|timer_getoverrun|timer_delete|clock_settime|clock_gettime|clock_getres|clock_nanosleep|tgkill +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4216, 30, 29), //mmap2|truncate64|ftruncate64|stat64|lstat64|fstat64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4221, 29, 28), //mincore|madvise|getdents64|fcntl64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4247, 28, 27), //gettid|readahead|setxattr|lsetxattr|fsetxattr|getxattr|lgetxattr|fgetxattr|listxattr|llistxattr|flistxattr|removexattr|lremovexattr|fremovexattr|tkill|sendfile64|futex|sched_setaffinity|sched_getaffinity|io_setup|io_destroy|io_getevents|io_submit|io_cancel|exit_group +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4316, 13, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4288, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4278, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4263, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4262, 23, 22), //epoll_create|epoll_ctl|epoll_wait|remap_file_pages|set_tid_address|restart_syscall|fadvise64|statfs64|fstatfs64|timer_create|timer_settime|timer_gettime|timer_getoverrun|timer_delete +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4267, 22, 21), //clock_gettime|clock_getres|clock_nanosleep|tgkill +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4283, 1, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4279, 20, 19), //waitid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4288, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4287, 18, 17), //set_thread_area|inotify_init|inotify_add_watch|inotify_rm_watch -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4292, 17, 16), //openat|mkdirat|mknodat|fchownat -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4316, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4312, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4308, 14, 13), //fstatat64|unlinkat|renameat|linkat|symlinkat|readlinkat|fchmodat|faccessat|pselect6|ppoll|unshare|splice|sync_file_range|tee|vmsplice -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4314, 13, 12), //getcpu|epoll_pwait -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4317, 12, 11), //utimensat -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4349, 5, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4341, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4338, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4336, 8, 7), //eventfd|fallocate|timerfd_create|timerfd_gettime|timerfd_settime|signalfd4|eventfd2|epoll_create1|dup3|pipe2|inotify_init1|preadv|pwritev|rt_tgsigqueueinfo|perf_event_open|accept4|recvmmsg +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4287, 19, 18), //set_thread_area|inotify_init|inotify_add_watch|inotify_rm_watch +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4312, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4293, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4292, 16, 15), //openat|mkdirat|mknodat|fchownat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4308, 15, 14), //fstatat64|unlinkat|renameat|linkat|symlinkat|readlinkat|fchmodat|faccessat|pselect6|ppoll|unshare|splice|sync_file_range|tee|vmsplice +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4314, 14, 13), //getcpu|epoll_pwait +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4349, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4338, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4319, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4317, 10, 9), //utimensat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4336, 9, 8), //eventfd|fallocate|timerfd_create|timerfd_gettime|timerfd_settime|signalfd4|eventfd2|epoll_create1|dup3|pipe2|inotify_init1|preadv|pwritev|rt_tgsigqueueinfo|perf_event_open|accept4|recvmmsg +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4342, 1, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4339, 7, 6), //prlimit64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4347, 6, 5), //clock_adjtime|syncfs|sendmmsg|setns|process_vm_readv|process_vm_writev +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4347, 6, 5), //syncfs|sendmmsg|setns|process_vm_readv|process_vm_writev BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4359, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4356, 1, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4355, 3, 2), //sched_setattr|sched_getattr|renameat2|seccomp|getrandom|memfd_create diff --git a/libc/seccomp/mips_global_policy.cpp b/libc/seccomp/mips_global_policy.cpp index 103e544f8..b193c09c1 100644 --- a/libc/seccomp/mips_global_policy.cpp +++ b/libc/seccomp/mips_global_policy.cpp @@ -5,117 +5,115 @@ #include "seccomp_bpfs.h" const sock_filter mips_global_filter[] = { -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4001, 0, 112), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4001, 0, 110), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4131, 55, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4063, 27, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4036, 13, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4023, 7, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4010, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4008, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4007, 105, 104), //exit|fork|read|write|open|close -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4009, 104, 103), //creat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4007, 103, 102), //exit|fork|read|write|open|close +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4009, 102, 101), //creat BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4019, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4013, 102, 101), //unlink|execve|chdir -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4022, 101, 100), //lseek|getpid|mount +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4013, 100, 99), //unlink|execve|chdir +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4022, 99, 98), //lseek|getpid|mount BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4033, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4026, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4025, 98, 97), //setuid|getuid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4027, 97, 96), //ptrace -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4034, 96, 95), //access +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4025, 96, 95), //setuid|getuid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4027, 95, 94), //ptrace +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4034, 94, 93), //access BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4054, 7, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4045, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4041, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4040, 92, 91), //sync|kill|rename|mkdir -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4044, 91, 90), //dup|pipe|times +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4040, 90, 89), //sync|kill|rename|mkdir +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4044, 89, 88), //dup|pipe|times BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4049, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4048, 89, 88), //brk|setgid|getgid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4053, 88, 87), //geteuid|getegid|acct|umount2 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4048, 87, 86), //brk|setgid|getgid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4053, 86, 85), //geteuid|getegid|acct|umount2 BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4060, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4057, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4056, 85, 84), //ioctl|fcntl -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4058, 84, 83), //setpgid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4062, 83, 82), //umask|chroot +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4056, 83, 82), //ioctl|fcntl +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4058, 82, 81), //setpgid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4062, 81, 80), //umask|chroot BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4094, 13, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4085, 7, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4070, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4066, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4065, 78, 77), //dup2|getppid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4068, 77, 76), //setsid|sigaction +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4065, 76, 75), //dup2|getppid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4068, 75, 74), //setsid|sigaction BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4074, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4072, 75, 74), //setreuid|setregid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4082, 74, 73), //sethostname|setrlimit|getrlimit|getrusage|gettimeofday|settimeofday|getgroups|setgroups +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4072, 73, 72), //setreuid|setregid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4082, 72, 71), //sethostname|setrlimit|getrlimit|getrusage|gettimeofday|settimeofday|getgroups|setgroups BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4090, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4087, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4086, 71, 70), //readlink -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4089, 70, 69), //swapon|reboot -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4093, 69, 68), //mmap|munmap|truncate +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4086, 69, 68), //readlink +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4089, 68, 67), //swapon|reboot +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4093, 67, 66), //mmap|munmap|truncate BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4118, 7, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4114, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4103, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4098, 65, 64), //fchmod|fchown|getpriority|setpriority -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4106, 64, 63), //syslog|setitimer|getitimer +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4098, 63, 62), //fchmod|fchown|getpriority|setpriority +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4106, 62, 61), //syslog|setitimer|getitimer BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4116, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4115, 62, 61), //wait4 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4117, 61, 60), //sysinfo +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4115, 60, 59), //wait4 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4117, 59, 58), //sysinfo BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4128, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4124, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4123, 58, 57), //fsync|sigreturn|clone|setdomainname|uname -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4126, 57, 56), //adjtimex|mprotect -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4130, 56, 55), //init_module|delete_module +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4123, 56, 55), //fsync|sigreturn|clone|setdomainname|uname +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4126, 55, 54), //adjtimex|mprotect +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4130, 54, 53), //init_module|delete_module BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4248, 27, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4179, 13, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4154, 7, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4138, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4136, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4134, 50, 49), //quotactl|getpgid|fchdir -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4137, 49, 48), //personality +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4134, 48, 47), //quotactl|getpgid|fchdir +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4137, 47, 46), //personality BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4151, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4148, 47, 46), //setfsuid|setfsgid|_llseek|getdents|_newselect|flock|msync|readv|writev|cacheflush -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4153, 46, 45), //getsid|fdatasync +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4148, 45, 44), //setfsuid|setfsgid|_llseek|getdents|_newselect|flock|msync|readv|writev|cacheflush +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4153, 44, 43), //getsid|fdatasync BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4176, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4169, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4168, 43, 42), //mlock|munlock|mlockall|munlockall|sched_setparam|sched_getparam|sched_setscheduler|sched_getscheduler|sched_yield|sched_get_priority_max|sched_get_priority_min|sched_rr_get_interval|nanosleep|mremap -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4175, 42, 41), //bind|connect|getpeername|getsockname|getsockopt|listen -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4178, 41, 40), //recvfrom|recvmsg +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4168, 41, 40), //mlock|munlock|mlockall|munlockall|sched_setparam|sched_getparam|sched_setscheduler|sched_getscheduler|sched_yield|sched_get_priority_max|sched_get_priority_min|sched_rr_get_interval|nanosleep|mremap +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4175, 40, 39), //bind|connect|getpeername|getsockname|getsockopt|listen +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4178, 39, 38), //recvfrom|recvmsg BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4210, 7, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4190, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4188, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4187, 37, 36), //sendmsg|sendto|setsockopt|shutdown|socket|socketpair|setresuid|getresuid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4189, 36, 35), //poll +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4187, 35, 34), //sendmsg|sendto|setsockopt|shutdown|socket|socketpair|setresuid|getresuid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4189, 34, 33), //poll BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4203, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4202, 34, 33), //setresgid|getresgid|prctl|rt_sigreturn|rt_sigaction|rt_sigprocmask|rt_sigpending|rt_sigtimedwait|rt_sigqueueinfo|rt_sigsuspend|pread64|pwrite64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4208, 33, 32), //getcwd|capget|capset|sigaltstack|sendfile +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4202, 32, 31), //setresgid|getresgid|prctl|rt_sigreturn|rt_sigaction|rt_sigprocmask|rt_sigpending|rt_sigtimedwait|rt_sigqueueinfo|rt_sigsuspend|pread64|pwrite64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4208, 31, 30), //getcwd|capget|capset|sigaltstack|sendfile BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4222, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4217, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4216, 30, 29), //mmap2|truncate64|ftruncate64|stat64|lstat64|fstat64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4221, 29, 28), //mincore|madvise|getdents64|fcntl64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4247, 28, 27), //gettid|readahead|setxattr|lsetxattr|fsetxattr|getxattr|lgetxattr|fgetxattr|listxattr|llistxattr|flistxattr|removexattr|lremovexattr|fremovexattr|tkill|sendfile64|futex|sched_setaffinity|sched_getaffinity|io_setup|io_destroy|io_getevents|io_submit|io_cancel|exit_group +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4216, 28, 27), //mmap2|truncate64|ftruncate64|stat64|lstat64|fstat64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4221, 27, 26), //mincore|madvise|getdents64|fcntl64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4247, 26, 25), //gettid|readahead|setxattr|lsetxattr|fsetxattr|getxattr|lgetxattr|fgetxattr|listxattr|llistxattr|flistxattr|removexattr|lremovexattr|fremovexattr|tkill|sendfile64|futex|sched_setaffinity|sched_getaffinity|io_setup|io_destroy|io_getevents|io_submit|io_cancel|exit_group BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4316, 13, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4288, 7, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4280, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4278, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4267, 23, 22), //epoll_create|epoll_ctl|epoll_wait|remap_file_pages|set_tid_address|restart_syscall|fadvise64|statfs64|fstatfs64|timer_create|timer_settime|timer_gettime|timer_getoverrun|timer_delete|clock_settime|clock_gettime|clock_getres|clock_nanosleep|tgkill -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4279, 22, 21), //waitid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4267, 21, 20), //epoll_create|epoll_ctl|epoll_wait|remap_file_pages|set_tid_address|restart_syscall|fadvise64|statfs64|fstatfs64|timer_create|timer_settime|timer_gettime|timer_getoverrun|timer_delete|clock_settime|clock_gettime|clock_getres|clock_nanosleep|tgkill +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4279, 20, 19), //waitid BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4282, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4281, 20, 19), //add_key -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4287, 19, 18), //keyctl|set_thread_area|inotify_init|inotify_add_watch|inotify_rm_watch +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4281, 18, 17), //add_key +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4287, 17, 16), //keyctl|set_thread_area|inotify_init|inotify_add_watch|inotify_rm_watch BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4312, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4293, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4292, 16, 15), //openat|mkdirat|mknodat|fchownat -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4308, 15, 14), //fstatat64|unlinkat|renameat|linkat|symlinkat|readlinkat|fchmodat|faccessat|pselect6|ppoll|unshare|splice|sync_file_range|tee|vmsplice -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4314, 14, 13), //getcpu|epoll_pwait -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4348, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4292, 14, 13), //openat|mkdirat|mknodat|fchownat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4308, 13, 12), //fstatat64|unlinkat|renameat|linkat|symlinkat|readlinkat|fchmodat|faccessat|pselect6|ppoll|unshare|splice|sync_file_range|tee|vmsplice +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4314, 12, 11), //getcpu|epoll_pwait +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4341, 5, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4338, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4319, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4317, 10, 9), //utimensat -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4336, 9, 8), //eventfd|fallocate|timerfd_create|timerfd_gettime|timerfd_settime|signalfd4|eventfd2|epoll_create1|dup3|pipe2|inotify_init1|preadv|pwritev|rt_tgsigqueueinfo|perf_event_open|accept4|recvmmsg -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4341, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4339, 7, 6), //prlimit64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4347, 6, 5), //clock_adjtime|syncfs|sendmmsg|setns|process_vm_readv|process_vm_writev +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4317, 8, 7), //utimensat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4336, 7, 6), //eventfd|fallocate|timerfd_create|timerfd_gettime|timerfd_settime|signalfd4|eventfd2|epoll_create1|dup3|pipe2|inotify_init1|preadv|pwritev|rt_tgsigqueueinfo|perf_event_open|accept4|recvmmsg +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4339, 6, 5), //prlimit64 BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4359, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4356, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4355, 3, 2), //finit_module|sched_setattr|sched_getattr|renameat2|seccomp|getrandom|memfd_create -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4357, 2, 1), //execveat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4348, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4347, 3, 2), //clock_adjtime|syncfs|sendmmsg|setns|process_vm_readv|process_vm_writev +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4357, 2, 1), //finit_module|sched_setattr|sched_getattr|renameat2|seccomp|getrandom|memfd_create|bpf|execveat BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4363, 1, 0), //mlock2|copy_file_range|preadv2|pwritev2 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), }; diff --git a/libc/seccomp/mips_system_policy.cpp b/libc/seccomp/mips_system_policy.cpp index 7b9da60e7..a88a6e3d4 100644 --- a/libc/seccomp/mips_system_policy.cpp +++ b/libc/seccomp/mips_system_policy.cpp @@ -5,115 +5,113 @@ #include "seccomp_bpfs.h" const sock_filter mips_system_filter[] = { -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4001, 0, 110), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4131, 55, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4001, 0, 108), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4128, 53, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4063, 27, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4036, 13, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4023, 7, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4010, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4008, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4007, 103, 102), //exit|fork|read|write|open|close -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4009, 102, 101), //creat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4007, 101, 100), //exit|fork|read|write|open|close +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4009, 100, 99), //creat BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4019, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4013, 100, 99), //unlink|execve|chdir -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4022, 99, 98), //lseek|getpid|mount +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4013, 98, 97), //unlink|execve|chdir +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4022, 97, 96), //lseek|getpid|mount BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4033, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4026, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4025, 96, 95), //setuid|getuid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4027, 95, 94), //ptrace -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4034, 94, 93), //access +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4025, 94, 93), //setuid|getuid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4027, 93, 92), //ptrace +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4034, 92, 91), //access BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4054, 7, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4045, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4041, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4040, 90, 89), //sync|kill|rename|mkdir -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4044, 89, 88), //dup|pipe|times +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4040, 88, 87), //sync|kill|rename|mkdir +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4044, 87, 86), //dup|pipe|times BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4049, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4048, 87, 86), //brk|setgid|getgid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4053, 86, 85), //geteuid|getegid|acct|umount2 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4048, 85, 84), //brk|setgid|getgid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4053, 84, 83), //geteuid|getegid|acct|umount2 BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4060, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4057, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4056, 83, 82), //ioctl|fcntl -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4058, 82, 81), //setpgid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4062, 81, 80), //umask|chroot +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4056, 81, 80), //ioctl|fcntl +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4058, 80, 79), //setpgid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4062, 79, 78), //umask|chroot BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4094, 13, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4085, 7, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4070, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4066, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4065, 76, 75), //dup2|getppid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4068, 75, 74), //setsid|sigaction +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4065, 74, 73), //dup2|getppid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4068, 73, 72), //setsid|sigaction BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4074, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4072, 73, 72), //setreuid|setregid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4082, 72, 71), //sethostname|setrlimit|getrlimit|getrusage|gettimeofday|settimeofday|getgroups|setgroups +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4072, 71, 70), //setreuid|setregid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4082, 70, 69), //sethostname|setrlimit|getrlimit|getrusage|gettimeofday|settimeofday|getgroups|setgroups BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4090, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4088, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4086, 69, 68), //readlink -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4089, 68, 67), //reboot -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4093, 67, 66), //mmap|munmap|truncate -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4118, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4086, 67, 66), //readlink +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4089, 66, 65), //reboot +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4093, 65, 64), //mmap|munmap|truncate +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4116, 5, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4114, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4103, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4098, 63, 62), //fchmod|fchown|getpriority|setpriority -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4106, 62, 61), //syslog|setitimer|getitimer -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4116, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4115, 60, 59), //wait4 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4117, 59, 58), //sysinfo -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4128, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4124, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4123, 56, 55), //fsync|sigreturn|clone|setdomainname|uname -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4126, 55, 54), //adjtimex|mprotect -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4130, 54, 53), //init_module|delete_module -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4248, 27, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4179, 13, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4154, 7, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4138, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4136, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4134, 48, 47), //quotactl|getpgid|fchdir -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4137, 47, 46), //personality -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4151, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4148, 45, 44), //setfsuid|setfsgid|_llseek|getdents|_newselect|flock|msync|readv|writev|cacheflush -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4153, 44, 43), //getsid|fdatasync -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4176, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4169, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4168, 41, 40), //mlock|munlock|mlockall|munlockall|sched_setparam|sched_getparam|sched_setscheduler|sched_getscheduler|sched_yield|sched_get_priority_max|sched_get_priority_min|sched_rr_get_interval|nanosleep|mremap -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4175, 40, 39), //bind|connect|getpeername|getsockname|getsockopt|listen -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4178, 39, 38), //recvfrom|recvmsg -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4210, 7, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4190, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4188, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4187, 35, 34), //sendmsg|sendto|setsockopt|shutdown|socket|socketpair|setresuid|getresuid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4189, 34, 33), //poll -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4203, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4202, 32, 31), //setresgid|getresgid|prctl|rt_sigreturn|rt_sigaction|rt_sigprocmask|rt_sigpending|rt_sigtimedwait|rt_sigqueueinfo|rt_sigsuspend|pread64|pwrite64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4208, 31, 30), //getcwd|capget|capset|sigaltstack|sendfile -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4222, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4217, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4216, 28, 27), //mmap2|truncate64|ftruncate64|stat64|lstat64|fstat64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4221, 27, 26), //mincore|madvise|getdents64|fcntl64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4247, 26, 25), //gettid|readahead|setxattr|lsetxattr|fsetxattr|getxattr|lgetxattr|fgetxattr|listxattr|llistxattr|flistxattr|removexattr|lremovexattr|fremovexattr|tkill|sendfile64|futex|sched_setaffinity|sched_getaffinity|io_setup|io_destroy|io_getevents|io_submit|io_cancel|exit_group -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4319, 13, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4293, 7, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4283, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4278, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4267, 21, 20), //epoll_create|epoll_ctl|epoll_wait|remap_file_pages|set_tid_address|restart_syscall|fadvise64|statfs64|fstatfs64|timer_create|timer_settime|timer_gettime|timer_getoverrun|timer_delete|clock_settime|clock_gettime|clock_getres|clock_nanosleep|tgkill -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4279, 20, 19), //waitid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4288, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4287, 18, 17), //set_thread_area|inotify_init|inotify_add_watch|inotify_rm_watch -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4292, 17, 16), //openat|mkdirat|mknodat|fchownat -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4316, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4312, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4308, 14, 13), //fstatat64|unlinkat|renameat|linkat|symlinkat|readlinkat|fchmodat|faccessat|pselect6|ppoll|unshare|splice|sync_file_range|tee|vmsplice -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4314, 13, 12), //getcpu|epoll_pwait -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4317, 12, 11), //utimensat -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4349, 5, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4341, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4338, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4336, 8, 7), //eventfd|fallocate|timerfd_create|timerfd_gettime|timerfd_settime|signalfd4|eventfd2|epoll_create1|dup3|pipe2|inotify_init1|preadv|pwritev|rt_tgsigqueueinfo|perf_event_open|accept4|recvmmsg -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4339, 7, 6), //prlimit64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4347, 6, 5), //clock_adjtime|syncfs|sendmmsg|setns|process_vm_readv|process_vm_writev +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4098, 61, 60), //fchmod|fchown|getpriority|setpriority +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4106, 60, 59), //syslog|setitimer|getitimer +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4115, 59, 58), //wait4 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4124, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4118, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4117, 56, 55), //sysinfo +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4123, 55, 54), //fsync|sigreturn|clone|setdomainname|uname +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4126, 54, 53), //adjtimex|mprotect +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4222, 27, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4176, 13, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4151, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4136, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4131, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4130, 48, 47), //init_module|delete_module +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4134, 47, 46), //quotactl|getpgid|fchdir +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4138, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4137, 45, 44), //personality +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4148, 44, 43), //setfsuid|setfsgid|_llseek|getdents|_newselect|flock|msync|readv|writev|cacheflush +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4169, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4154, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4153, 41, 40), //getsid|fdatasync +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4168, 40, 39), //mlock|munlock|mlockall|munlockall|sched_setparam|sched_getparam|sched_setscheduler|sched_getscheduler|sched_yield|sched_get_priority_max|sched_get_priority_min|sched_rr_get_interval|nanosleep|mremap +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4175, 39, 38), //bind|connect|getpeername|getsockname|getsockopt|listen +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4203, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4188, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4179, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4178, 35, 34), //recvfrom|recvmsg +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4187, 34, 33), //sendmsg|sendto|setsockopt|shutdown|socket|socketpair|setresuid|getresuid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4190, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4189, 32, 31), //poll +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4202, 31, 30), //setresgid|getresgid|prctl|rt_sigreturn|rt_sigaction|rt_sigprocmask|rt_sigpending|rt_sigtimedwait|rt_sigqueueinfo|rt_sigsuspend|pread64|pwrite64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4217, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4210, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4208, 28, 27), //getcwd|capget|capset|sigaltstack|sendfile +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4216, 27, 26), //mmap2|truncate64|ftruncate64|stat64|lstat64|fstat64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4221, 26, 25), //mincore|madvise|getdents64|fcntl64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4316, 13, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4288, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4278, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4248, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4247, 21, 20), //gettid|readahead|setxattr|lsetxattr|fsetxattr|getxattr|lgetxattr|fgetxattr|listxattr|llistxattr|flistxattr|removexattr|lremovexattr|fremovexattr|tkill|sendfile64|futex|sched_setaffinity|sched_getaffinity|io_setup|io_destroy|io_getevents|io_submit|io_cancel|exit_group +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4267, 20, 19), //epoll_create|epoll_ctl|epoll_wait|remap_file_pages|set_tid_address|restart_syscall|fadvise64|statfs64|fstatfs64|timer_create|timer_settime|timer_gettime|timer_getoverrun|timer_delete|clock_settime|clock_gettime|clock_getres|clock_nanosleep|tgkill +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4283, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4279, 18, 17), //waitid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4287, 17, 16), //set_thread_area|inotify_init|inotify_add_watch|inotify_rm_watch +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4312, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4293, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4292, 14, 13), //openat|mkdirat|mknodat|fchownat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4308, 13, 12), //fstatat64|unlinkat|renameat|linkat|symlinkat|readlinkat|fchmodat|faccessat|pselect6|ppoll|unshare|splice|sync_file_range|tee|vmsplice +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4314, 12, 11), //getcpu|epoll_pwait +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4341, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4338, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4319, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4317, 8, 7), //utimensat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4336, 7, 6), //eventfd|fallocate|timerfd_create|timerfd_gettime|timerfd_settime|signalfd4|eventfd2|epoll_create1|dup3|pipe2|inotify_init1|preadv|pwritev|rt_tgsigqueueinfo|perf_event_open|accept4|recvmmsg +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4339, 6, 5), //prlimit64 BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4359, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4356, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4355, 3, 2), //sched_setattr|sched_getattr|renameat2|seccomp|getrandom|memfd_create -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4357, 2, 1), //execveat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4349, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4347, 3, 2), //clock_adjtime|syncfs|sendmmsg|setns|process_vm_readv|process_vm_writev +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4357, 2, 1), //sched_setattr|sched_getattr|renameat2|seccomp|getrandom|memfd_create|bpf|execveat BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4363, 1, 0), //mlock2|copy_file_range|preadv2|pwritev2 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), }; diff --git a/libc/seccomp/seccomp_policy.cpp b/libc/seccomp/seccomp_policy.cpp index 99a821fc6..3d617bef6 100644 --- a/libc/seccomp/seccomp_policy.cpp +++ b/libc/seccomp/seccomp_policy.cpp @@ -133,11 +133,7 @@ static bool install_filter(filter const& f) { static_cast<unsigned short>(f.size()), const_cast<struct sock_filter*>(&f[0]), }; - - if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) == -1) { - PLOG(FATAL) << "Could not set to no new privs"; - return false; - } + // This assumes either the current process has CAP_SYS_ADMIN, or PR_SET_NO_NEW_PRIVS bit is set. if (prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog) < 0) { PLOG(FATAL) << "Could not set seccomp filter of size " << f.size(); return false; @@ -210,10 +206,6 @@ bool _set_seccomp_filter(FilterType type) { return install_filter(f); } -bool set_seccomp_filter() { - return _set_seccomp_filter(FilterType::APP); -} - bool set_app_seccomp_filter() { return _set_seccomp_filter(FilterType::APP); } diff --git a/libc/seccomp/x86_64_app_policy.cpp b/libc/seccomp/x86_64_app_policy.cpp index 171b95902..b90124b82 100644 --- a/libc/seccomp/x86_64_app_policy.cpp +++ b/libc/seccomp/x86_64_app_policy.cpp @@ -5,92 +5,108 @@ #include "seccomp_bpfs.h" const sock_filter x86_64_app_filter[] = { -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 0, 0, 88), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 175, 43, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 79, 21, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 35, 11, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 8, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 0, 0, 104), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 155, 51, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 93, 25, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 38, 13, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 24, 7, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 5, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 3, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 2, 81, 80), //read|write -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4, 80, 79), //close -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 6, 79, 78), //fstat -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 32, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 24, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 21, 76, 75), //lseek|mmap|mprotect|munmap|brk|rt_sigaction|rt_sigprocmask|rt_sigreturn|ioctl|pread64|pwrite64|readv|writev -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 29, 75, 74), //sched_yield|mremap|msync|mincore|madvise -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 33, 74, 73), //dup -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 58, 5, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 44, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 38, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 37, 70, 69), //nanosleep|getitimer -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 43, 69, 68), //setitimer|getpid|sendfile|socket|connect -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 57, 68, 67), //sendto|recvfrom|sendmsg|recvmsg|shutdown|bind|listen|getsockname|getpeername|socketpair|setsockopt|getsockopt|clone -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 72, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 64, 66, 65), //vfork|execve|exit|wait4|kill|uname -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 78, 65, 64), //fcntl|flock|fsync|fdatasync|truncate|ftruncate -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 137, 11, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 95, 5, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 93, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 91, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 82, 60, 59), //getcwd|chdir|fchdir -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 92, 59, 58), //fchmod -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 94, 58, 57), //fchown -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 135, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 112, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 111, 55, 54), //umask|gettimeofday|getrlimit|getrusage|sysinfo|times|ptrace|getuid|syslog|getgid|setuid|setgid|geteuid|getegid|setpgid|getppid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 132, 54, 53), //setsid|setreuid|setregid|getgroups|setgroups|setresuid|getresuid|setresgid|getresgid|getpgid|setfsuid|setfsgid|getsid|capget|capset|rt_sigpending|rt_sigtimedwait|rt_sigqueueinfo|rt_sigsuspend|sigaltstack -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 136, 53, 52), //personality -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 157, 5, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 155, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 140, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 139, 49, 48), //statfs|fstatfs -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 153, 48, 47), //getpriority|setpriority|sched_setparam|sched_getparam|sched_setscheduler|sched_getscheduler|sched_get_priority_max|sched_get_priority_min|sched_rr_get_interval|mlock|munlock|mlockall|munlockall -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 156, 47, 46), //pivot_root -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 169, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 167, 45, 44), //prctl|arch_prctl|adjtimex|setrlimit|chroot|sync|acct|settimeofday|mount|umount2 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 172, 44, 43), //reboot|sethostname|setdomainname -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 257, 21, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 221, 11, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 202, 5, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 186, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 179, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 177, 38, 37), //init_module|delete_module -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 180, 37, 36), //quotactl -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 201, 36, 35), //gettid|readahead|setxattr|lsetxattr|fsetxattr|getxattr|lgetxattr|fgetxattr|listxattr|llistxattr|flistxattr|removexattr|lremovexattr|fremovexattr|tkill -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 217, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 206, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 205, 33, 32), //futex|sched_setaffinity|sched_getaffinity -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 211, 32, 31), //io_setup|io_destroy|io_getevents|io_submit|io_cancel -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 220, 31, 30), //getdents64|set_tid_address|restart_syscall -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 251, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 2, 97, 96), //read|write +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 4, 96, 95), //close +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 8, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 6, 94, 93), //fstat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 21, 93, 92), //lseek|mmap|mprotect|munmap|brk|rt_sigaction|rt_sigprocmask|rt_sigreturn|ioctl|pread64|pwrite64|readv|writev +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 35, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 32, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 29, 90, 89), //sched_yield|mremap|msync|mincore|madvise +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 33, 89, 88), //dup +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 37, 88, 87), //nanosleep|getitimer +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 72, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 58, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 44, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 43, 84, 83), //setitimer|getpid|sendfile|socket|connect +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 57, 83, 82), //sendto|recvfrom|sendmsg|recvmsg|shutdown|bind|listen|getsockname|getpeername|socketpair|setsockopt|getsockopt|clone +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 64, 82, 81), //vfork|execve|exit|wait4|kill|uname +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 91, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 79, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 78, 79, 78), //fcntl|flock|fsync|fdatasync|truncate|ftruncate +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 82, 78, 77), //getcwd|chdir|fchdir +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 92, 77, 76), //fchmod +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 120, 13, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 112, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 104, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 95, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 94, 72, 71), //fchown +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 103, 71, 70), //umask|gettimeofday|getrlimit|getrusage|sysinfo|times|ptrace|getuid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 107, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 105, 69, 68), //getgid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 111, 68, 67), //geteuid|getegid|setpgid|getppid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 118, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 114, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 113, 65, 64), //setsid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 116, 64, 63), //setregid|getgroups +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 119, 63, 62), //getresuid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 135, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 127, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 124, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 122, 59, 58), //getresgid|getpgid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 126, 58, 57), //getsid|capget +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 132, 57, 56), //rt_sigpending|rt_sigtimedwait|rt_sigqueueinfo|rt_sigsuspend|sigaltstack +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 140, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 137, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 136, 54, 53), //personality +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 139, 53, 52), //statfs|fstatfs +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 153, 52, 51), //getpriority|setpriority|sched_setparam|sched_getparam|sched_setscheduler|sched_getscheduler|sched_get_priority_max|sched_get_priority_min|sched_rr_get_interval|mlock|munlock|mlockall|munlockall +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 251, 25, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 206, 13, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 179, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 160, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 157, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 156, 46, 45), //pivot_root +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 159, 45, 44), //prctl|arch_prctl +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 162, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 161, 43, 42), //setrlimit +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 163, 42, 41), //sync +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 202, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 186, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 180, 39, 38), //quotactl +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 201, 38, 37), //gettid|readahead|setxattr|lsetxattr|fsetxattr|getxattr|lgetxattr|fgetxattr|listxattr|llistxattr|flistxattr|removexattr|lremovexattr|fremovexattr|tkill +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 205, 37, 36), //futex|sched_setaffinity|sched_getaffinity +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 228, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 221, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 217, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 211, 33, 32), //io_setup|io_destroy|io_getevents|io_submit|io_cancel +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 220, 32, 31), //getdents64|set_tid_address|restart_syscall +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 227, 31, 30), //fadvise64|timer_create|timer_settime|timer_gettime|timer_getoverrun|timer_delete BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 247, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 233, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 232, 27, 26), //fadvise64|timer_create|timer_settime|timer_gettime|timer_getoverrun|timer_delete|clock_settime|clock_gettime|clock_getres|clock_nanosleep|exit_group -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 235, 26, 25), //epoll_ctl|tgkill -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 248, 25, 24), //waitid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 232, 28, 27), //clock_gettime|clock_getres|clock_nanosleep|exit_group +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 235, 27, 26), //epoll_ctl|tgkill +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 248, 26, 25), //waitid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 285, 13, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 275, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 257, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 254, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 253, 23, 22), //ioprio_set|ioprio_get -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 256, 22, 21), //inotify_add_watch|inotify_rm_watch -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 302, 11, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 280, 5, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 275, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 253, 21, 20), //ioprio_set|ioprio_get +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 256, 20, 19), //inotify_add_watch|inotify_rm_watch BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 262, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 261, 17, 16), //openat|mkdirat|mknodat|fchownat -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 273, 16, 15), //newfstatat|unlinkat|renameat|linkat|symlinkat|readlinkat|fchmodat|faccessat|pselect6|ppoll|unshare -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 279, 15, 14), //splice|tee|sync_file_range|vmsplice -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 285, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 283, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 282, 12, 11), //utimensat|epoll_pwait -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 284, 11, 10), //timerfd_create -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 300, 10, 9), //fallocate|timerfd_settime|timerfd_gettime|accept4|signalfd4|eventfd2|epoll_create1|dup3|pipe2|inotify_init1|preadv|pwritev|rt_tgsigqueueinfo|perf_event_open|recvmmsg -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 322, 5, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 314, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 305, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 303, 6, 5), //prlimit64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 312, 5, 4), //clock_adjtime|syncfs|sendmmsg|setns|getcpu|process_vm_readv|process_vm_writev -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 320, 4, 3), //sched_setattr|sched_getattr|renameat2|seccomp|getrandom|memfd_create -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 325, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 261, 18, 17), //openat|mkdirat|mknodat|fchownat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 273, 17, 16), //newfstatat|unlinkat|renameat|linkat|symlinkat|readlinkat|fchmodat|faccessat|pselect6|ppoll|unshare +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 283, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 280, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 279, 14, 13), //splice|tee|sync_file_range|vmsplice +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 282, 13, 12), //utimensat|epoll_pwait +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 284, 12, 11), //timerfd_create +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 314, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 306, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 302, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 300, 8, 7), //fallocate|timerfd_settime|timerfd_gettime|accept4|signalfd4|eventfd2|epoll_create1|dup3|pipe2|inotify_init1|preadv|pwritev|rt_tgsigqueueinfo|perf_event_open|recvmmsg +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 303, 7, 6), //prlimit64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 312, 6, 5), //syncfs|sendmmsg|setns|getcpu|process_vm_readv|process_vm_writev +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 325, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 322, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 320, 3, 2), //sched_setattr|sched_getattr|renameat2|seccomp|getrandom|memfd_create BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 323, 2, 1), //execveat BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 329, 1, 0), //mlock2|copy_file_range|preadv2|pwritev2 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), diff --git a/libc/seccomp/x86_64_global_policy.cpp b/libc/seccomp/x86_64_global_policy.cpp index 801d6c2c2..8142ce4db 100644 --- a/libc/seccomp/x86_64_global_policy.cpp +++ b/libc/seccomp/x86_64_global_policy.cpp @@ -84,14 +84,14 @@ BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 283, 1, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 282, 12, 11), //utimensat|epoll_pwait BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 284, 11, 10), //timerfd_create BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 300, 10, 9), //fallocate|timerfd_settime|timerfd_gettime|accept4|signalfd4|eventfd2|epoll_create1|dup3|pipe2|inotify_init1|preadv|pwritev|rt_tgsigqueueinfo|perf_event_open|recvmmsg -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 322, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 321, 5, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 313, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 305, 1, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 303, 6, 5), //prlimit64 BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 312, 5, 4), //clock_adjtime|syncfs|sendmmsg|setns|getcpu|process_vm_readv|process_vm_writev BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 320, 4, 3), //finit_module|sched_setattr|sched_getattr|renameat2|seccomp|getrandom|memfd_create BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 325, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 323, 2, 1), //execveat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 323, 2, 1), //bpf|execveat BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 329, 1, 0), //mlock2|copy_file_range|preadv2|pwritev2 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), }; diff --git a/libc/seccomp/x86_64_system_policy.cpp b/libc/seccomp/x86_64_system_policy.cpp index f2b2601cf..67859eb90 100644 --- a/libc/seccomp/x86_64_system_policy.cpp +++ b/libc/seccomp/x86_64_system_policy.cpp @@ -84,14 +84,14 @@ BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 283, 1, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 282, 12, 11), //utimensat|epoll_pwait BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 284, 11, 10), //timerfd_create BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 300, 10, 9), //fallocate|timerfd_settime|timerfd_gettime|accept4|signalfd4|eventfd2|epoll_create1|dup3|pipe2|inotify_init1|preadv|pwritev|rt_tgsigqueueinfo|perf_event_open|recvmmsg -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 322, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 321, 5, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 314, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 305, 1, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 303, 6, 5), //prlimit64 BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 312, 5, 4), //clock_adjtime|syncfs|sendmmsg|setns|getcpu|process_vm_readv|process_vm_writev BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 320, 4, 3), //sched_setattr|sched_getattr|renameat2|seccomp|getrandom|memfd_create BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 325, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 323, 2, 1), //execveat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 323, 2, 1), //bpf|execveat BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 329, 1, 0), //mlock2|copy_file_range|preadv2|pwritev2 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), }; diff --git a/libc/seccomp/x86_app_policy.cpp b/libc/seccomp/x86_app_policy.cpp index 2db23680d..5131efac2 100644 --- a/libc/seccomp/x86_app_policy.cpp +++ b/libc/seccomp/x86_app_policy.cpp @@ -5,116 +5,124 @@ #include "seccomp_bpfs.h" const sock_filter x86_app_filter[] = { -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 0, 0, 116), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 131, 57, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 66, 29, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 0, 0, 124), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 150, 61, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 77, 31, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 41, 15, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 24, 7, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 10, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 8, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 7, 109, 108), //restart_syscall|exit|fork|read|write|open|close -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 9, 108, 107), //creat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 7, 117, 116), //restart_syscall|exit|fork|read|write|open|close +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 9, 116, 115), //creat BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 19, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 13, 106, 105), //unlink|execve|chdir -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 22, 105, 104), //lseek|getpid|mount +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 13, 114, 113), //unlink|execve|chdir +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 21, 113, 112), //lseek|getpid BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 33, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 26, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 25, 102, 101), //getuid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 27, 101, 100), //ptrace +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 25, 110, 109), //getuid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 27, 109, 108), //ptrace BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 36, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 34, 99, 98), //access -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 40, 98, 97), //sync|kill|rename|mkdir -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 57, 7, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 51, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 34, 107, 106), //access +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 40, 106, 105), //sync|kill|rename|mkdir +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 60, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 54, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 45, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 44, 94, 93), //dup|pipe|times -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 46, 93, 92), //brk -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 54, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 53, 91, 90), //acct|umount2 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 56, 90, 89), //ioctl|fcntl -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 63, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 60, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 58, 87, 86), //setpgid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 62, 86, 85), //umask|chroot -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 65, 85, 84), //dup2|getppid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 96, 13, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 88, 7, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 77, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 74, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 68, 80, 79), //setsid|sigaction -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 76, 79, 78), //sethostname|setrlimit +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 44, 102, 101), //dup|pipe|times +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 46, 101, 100), //brk +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 57, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 56, 99, 98), //ioctl|fcntl +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 58, 98, 97), //setpgid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 66, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 63, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 61, 95, 94), //umask +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 65, 94, 93), //dup2|getppid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 75, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 68, 92, 91), //setsid|sigaction +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 76, 91, 90), //setrlimit +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 116, 15, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 96, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 90, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 85, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 80, 77, 76), //getrusage|gettimeofday|settimeofday -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 86, 76, 75), //readlink -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 94, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 90, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 89, 73, 72), //reboot -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 93, 72, 71), //mmap|munmap|truncate -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 95, 71, 70), //fchmod -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 118, 7, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 114, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 79, 86, 85), //getrusage|gettimeofday +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 86, 85, 84), //readlink +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 94, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 93, 83, 82), //mmap|munmap|truncate +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 95, 82, 81), //fchmod +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 104, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 102, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 98, 67, 66), //getpriority|setpriority -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 106, 66, 65), //socketcall|syslog|setitimer|getitimer -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 116, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 115, 64, 63), //wait4 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 117, 63, 62), //sysinfo -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 128, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 124, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 123, 60, 59), //fsync|sigreturn|clone|setdomainname|uname -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 126, 59, 58), //adjtimex|mprotect -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 130, 58, 57), //init_module|delete_module -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 272, 29, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 199, 15, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 168, 7, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 138, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 98, 79, 78), //getpriority|setpriority +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 103, 78, 77), //socketcall +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 114, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 106, 76, 75), //setitimer|getitimer +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 115, 75, 74), //wait4 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 131, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 122, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 118, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 117, 71, 70), //sysinfo +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 121, 70, 69), //fsync|sigreturn|clone +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 125, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 123, 68, 67), //uname +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 126, 67, 66), //mprotect +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 140, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 136, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 134, 52, 51), //quotactl|getpgid|fchdir -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 137, 51, 50), //personality -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 150, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 149, 49, 48), //setfsuid|setfsgid|_llseek|getdents|_newselect|flock|msync|readv|writev|getsid|fdatasync -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 164, 48, 47), //mlock|munlock|mlockall|munlockall|sched_setparam|sched_getparam|sched_setscheduler|sched_getscheduler|sched_yield|sched_get_priority_max|sched_get_priority_min|sched_rr_get_interval|nanosleep|mremap -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 183, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 172, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 169, 45, 44), //poll -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 182, 44, 43), //prctl|rt_sigreturn|rt_sigaction|rt_sigprocmask|rt_sigpending|rt_sigtimedwait|rt_sigqueueinfo|rt_sigsuspend|pread64|pwrite64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 134, 64, 63), //quotactl|getpgid|fchdir +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 137, 63, 62), //personality +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 149, 62, 61), //_llseek|getdents|_newselect|flock|msync|readv|writev|getsid|fdatasync +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 265, 31, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 207, 15, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 186, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 172, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 168, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 164, 56, 55), //mlock|munlock|mlockall|munlockall|sched_setparam|sched_getparam|sched_setscheduler|sched_getscheduler|sched_yield|sched_get_priority_max|sched_get_priority_min|sched_rr_get_interval|nanosleep|mremap +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 169, 55, 54), //poll +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 183, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 182, 53, 52), //prctl|rt_sigreturn|rt_sigaction|rt_sigprocmask|rt_sigpending|rt_sigtimedwait|rt_sigqueueinfo|rt_sigsuspend|pread64|pwrite64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 185, 52, 51), //getcwd|capget +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 199, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 190, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 188, 42, 41), //getcwd|capget|capset|sigaltstack|sendfile -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 198, 41, 40), //vfork|ugetrlimit|mmap2|truncate64|ftruncate64|stat64|lstat64|fstat64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 245, 7, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 218, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 213, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 212, 37, 36), //getuid32|getgid32|geteuid32|getegid32|setreuid32|setregid32|getgroups32|setgroups32|fchown32|setresuid32|getresuid32|setresgid32|getresgid32 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 215, 36, 35), //setuid32|setgid32 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 224, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 222, 34, 33), //mincore|madvise|getdents64|fcntl64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 244, 33, 32), //gettid|readahead|setxattr|lsetxattr|fsetxattr|getxattr|lgetxattr|fgetxattr|listxattr|llistxattr|flistxattr|removexattr|lremovexattr|fremovexattr|tkill|sendfile64|futex|sched_setaffinity|sched_getaffinity|set_thread_area -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 254, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 252, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 250, 30, 29), //io_setup|io_destroy|io_getevents|io_submit|io_cancel -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 253, 29, 28), //exit_group -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 271, 28, 27), //epoll_create|epoll_ctl|epoll_wait|remap_file_pages|set_tid_address|timer_create|timer_settime|timer_gettime|timer_getoverrun|timer_delete|clock_settime|clock_gettime|clock_getres|clock_nanosleep|statfs64|fstatfs64|tgkill -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 322, 13, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 300, 7, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 291, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 284, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 273, 23, 22), //fadvise64_64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 188, 49, 48), //sigaltstack|sendfile +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 198, 48, 47), //vfork|ugetrlimit|mmap2|truncate64|ftruncate64|stat64|lstat64|fstat64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 204, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 203, 46, 45), //getuid32|getgid32|geteuid32|getegid32 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 206, 45, 44), //setregid32|getgroups32 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 224, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 211, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 209, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 208, 41, 40), //fchown32 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 210, 40, 39), //getresuid32 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 218, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 212, 38, 37), //getresgid32 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 222, 37, 36), //mincore|madvise|getdents64|fcntl64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 252, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 245, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 244, 34, 33), //gettid|readahead|setxattr|lsetxattr|fsetxattr|getxattr|lgetxattr|fgetxattr|listxattr|llistxattr|flistxattr|removexattr|lremovexattr|fremovexattr|tkill|sendfile64|futex|sched_setaffinity|sched_getaffinity|set_thread_area +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 250, 33, 32), //io_setup|io_destroy|io_getevents|io_submit|io_cancel +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 254, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 253, 31, 30), //exit_group +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 264, 30, 29), //epoll_create|epoll_ctl|epoll_wait|remap_file_pages|set_tid_address|timer_create|timer_settime|timer_gettime|timer_getoverrun|timer_delete +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 322, 15, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 295, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 284, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 272, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 271, 25, 24), //clock_gettime|clock_getres|clock_nanosleep|statfs64|fstatfs64|tgkill +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 273, 24, 23), //fadvise64_64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 291, 1, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 285, 22, 21), //waitid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 295, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 294, 20, 19), //inotify_init|inotify_add_watch|inotify_rm_watch -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 299, 19, 18), //openat|mkdirat|mknodat|fchownat -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 318, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 313, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 311, 16, 15), //fstatat64|unlinkat|renameat|linkat|symlinkat|readlinkat|fchmodat|faccessat|pselect6|ppoll|unshare +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 294, 21, 20), //inotify_init|inotify_add_watch|inotify_rm_watch +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 313, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 300, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 299, 18, 17), //openat|mkdirat|mknodat|fchownat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 311, 17, 16), //fstatat64|unlinkat|renameat|linkat|symlinkat|readlinkat|fchmodat|faccessat|pselect6|ppoll|unshare +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 318, 1, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 317, 15, 14), //splice|sync_file_range|tee|vmsplice BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 321, 14, 13), //getcpu|epoll_pwait|utimensat BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 351, 7, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 343, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 344, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 340, 1, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 337, 10, 9), //timerfd_create|eventfd|fallocate|timerfd_settime|timerfd_gettime|signalfd4|eventfd2|epoll_create1|dup3|pipe2|inotify_init1|preadv|pwritev|rt_tgsigqueueinfo|perf_event_open BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 341, 9, 8), //prlimit64 BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 346, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 345, 7, 6), //clock_adjtime|syncfs +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 345, 7, 6), //syncfs BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 349, 6, 5), //setns|process_vm_readv|process_vm_writev BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 376, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 358, 1, 0), diff --git a/libc/seccomp/x86_global_policy.cpp b/libc/seccomp/x86_global_policy.cpp index 9305729b1..3fd06eeab 100644 --- a/libc/seccomp/x86_global_policy.cpp +++ b/libc/seccomp/x86_global_policy.cpp @@ -5,125 +5,123 @@ #include "seccomp_bpfs.h" const sock_filter x86_global_filter[] = { -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 0, 0, 120), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 0, 0, 118), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 136, 59, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 66, 29, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 41, 15, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 24, 7, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 10, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 8, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 7, 113, 112), //restart_syscall|exit|fork|read|write|open|close -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 9, 112, 111), //creat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 7, 111, 110), //restart_syscall|exit|fork|read|write|open|close +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 9, 110, 109), //creat BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 19, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 13, 110, 109), //unlink|execve|chdir -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 22, 109, 108), //lseek|getpid|mount +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 13, 108, 107), //unlink|execve|chdir +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 22, 107, 106), //lseek|getpid|mount BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 33, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 26, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 25, 106, 105), //getuid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 27, 105, 104), //ptrace +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 25, 104, 103), //getuid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 27, 103, 102), //ptrace BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 36, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 34, 103, 102), //access -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 40, 102, 101), //sync|kill|rename|mkdir +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 34, 101, 100), //access +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 40, 100, 99), //sync|kill|rename|mkdir BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 57, 7, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 51, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 45, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 44, 98, 97), //dup|pipe|times -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 46, 97, 96), //brk +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 44, 96, 95), //dup|pipe|times +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 46, 95, 94), //brk BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 54, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 53, 95, 94), //acct|umount2 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 56, 94, 93), //ioctl|fcntl +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 53, 93, 92), //acct|umount2 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 56, 92, 91), //ioctl|fcntl BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 63, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 60, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 58, 91, 90), //setpgid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 62, 90, 89), //umask|chroot -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 65, 89, 88), //dup2|getppid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 58, 89, 88), //setpgid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 62, 88, 87), //umask|chroot +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 65, 87, 86), //dup2|getppid BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 102, 15, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 87, 7, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 77, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 74, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 68, 84, 83), //setsid|sigaction -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 76, 83, 82), //sethostname|setrlimit +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 68, 82, 81), //setsid|sigaction +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 76, 81, 80), //sethostname|setrlimit BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 85, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 80, 81, 80), //getrusage|gettimeofday|settimeofday -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 86, 80, 79), //readlink +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 80, 79, 78), //getrusage|gettimeofday|settimeofday +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 86, 78, 77), //readlink BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 94, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 90, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 89, 77, 76), //swapon|reboot -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 93, 76, 75), //mmap|munmap|truncate +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 89, 75, 74), //swapon|reboot +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 93, 74, 73), //mmap|munmap|truncate BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 96, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 95, 74, 73), //fchmod -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 98, 73, 72), //getpriority|setpriority +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 95, 72, 71), //fchmod +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 98, 71, 70), //getpriority|setpriority BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 124, 7, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 116, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 114, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 106, 69, 68), //socketcall|syslog|setitimer|getitimer -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 115, 68, 67), //wait4 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 106, 67, 66), //socketcall|syslog|setitimer|getitimer +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 115, 66, 65), //wait4 BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 118, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 117, 66, 65), //sysinfo -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 123, 65, 64), //fsync|sigreturn|clone|setdomainname|uname +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 117, 64, 63), //sysinfo +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 123, 63, 62), //fsync|sigreturn|clone|setdomainname|uname BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 131, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 128, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 126, 62, 61), //adjtimex|mprotect -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 130, 61, 60), //init_module|delete_module -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 134, 60, 59), //quotactl|getpgid|fchdir +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 126, 60, 59), //adjtimex|mprotect +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 130, 59, 58), //init_module|delete_module +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 134, 58, 57), //quotactl|getpgid|fchdir BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 284, 29, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 213, 15, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 172, 7, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 150, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 138, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 137, 54, 53), //personality -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 149, 53, 52), //setfsuid|setfsgid|_llseek|getdents|_newselect|flock|msync|readv|writev|getsid|fdatasync +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 137, 52, 51), //personality +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 149, 51, 50), //setfsuid|setfsgid|_llseek|getdents|_newselect|flock|msync|readv|writev|getsid|fdatasync BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 168, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 164, 51, 50), //mlock|munlock|mlockall|munlockall|sched_setparam|sched_getparam|sched_setscheduler|sched_getscheduler|sched_yield|sched_get_priority_max|sched_get_priority_min|sched_rr_get_interval|nanosleep|mremap -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 169, 50, 49), //poll +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 164, 49, 48), //mlock|munlock|mlockall|munlockall|sched_setparam|sched_getparam|sched_setscheduler|sched_getscheduler|sched_yield|sched_get_priority_max|sched_get_priority_min|sched_rr_get_interval|nanosleep|mremap +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 169, 48, 47), //poll BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 190, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 183, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 182, 47, 46), //prctl|rt_sigreturn|rt_sigaction|rt_sigprocmask|rt_sigpending|rt_sigtimedwait|rt_sigqueueinfo|rt_sigsuspend|pread64|pwrite64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 188, 46, 45), //getcwd|capget|capset|sigaltstack|sendfile +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 182, 45, 44), //prctl|rt_sigreturn|rt_sigaction|rt_sigprocmask|rt_sigpending|rt_sigtimedwait|rt_sigqueueinfo|rt_sigsuspend|pread64|pwrite64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 188, 44, 43), //getcwd|capget|capset|sigaltstack|sendfile BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 199, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 198, 44, 43), //vfork|ugetrlimit|mmap2|truncate64|ftruncate64|stat64|lstat64|fstat64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 212, 43, 42), //getuid32|getgid32|geteuid32|getegid32|setreuid32|setregid32|getgroups32|setgroups32|fchown32|setresuid32|getresuid32|setresgid32|getresgid32 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 198, 42, 41), //vfork|ugetrlimit|mmap2|truncate64|ftruncate64|stat64|lstat64|fstat64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 212, 41, 40), //getuid32|getgid32|geteuid32|getegid32|setreuid32|setregid32|getgroups32|setgroups32|fchown32|setresuid32|getresuid32|setresgid32|getresgid32 BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 252, 7, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 224, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 218, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 215, 39, 38), //setuid32|setgid32 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 222, 38, 37), //mincore|madvise|getdents64|fcntl64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 215, 37, 36), //setuid32|setgid32 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 222, 36, 35), //mincore|madvise|getdents64|fcntl64 BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 245, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 244, 36, 35), //gettid|readahead|setxattr|lsetxattr|fsetxattr|getxattr|lgetxattr|fgetxattr|listxattr|llistxattr|flistxattr|removexattr|lremovexattr|fremovexattr|tkill|sendfile64|futex|sched_setaffinity|sched_getaffinity|set_thread_area -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 250, 35, 34), //io_setup|io_destroy|io_getevents|io_submit|io_cancel +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 244, 34, 33), //gettid|readahead|setxattr|lsetxattr|fsetxattr|getxattr|lgetxattr|fgetxattr|listxattr|llistxattr|flistxattr|removexattr|lremovexattr|fremovexattr|tkill|sendfile64|futex|sched_setaffinity|sched_getaffinity|set_thread_area +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 250, 33, 32), //io_setup|io_destroy|io_getevents|io_submit|io_cancel BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 272, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 254, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 253, 32, 31), //exit_group -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 271, 31, 30), //epoll_create|epoll_ctl|epoll_wait|remap_file_pages|set_tid_address|timer_create|timer_settime|timer_gettime|timer_getoverrun|timer_delete|clock_settime|clock_gettime|clock_getres|clock_nanosleep|statfs64|fstatfs64|tgkill -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 273, 30, 29), //fadvise64_64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 322, 15, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 253, 30, 29), //exit_group +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 271, 29, 28), //epoll_create|epoll_ctl|epoll_wait|remap_file_pages|set_tid_address|timer_create|timer_settime|timer_gettime|timer_getoverrun|timer_delete|clock_settime|clock_gettime|clock_getres|clock_nanosleep|statfs64|fstatfs64|tgkill +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 273, 28, 27), //fadvise64_64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 318, 13, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 295, 7, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 288, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 286, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 285, 25, 24), //waitid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 287, 24, 23), //add_key +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 285, 23, 22), //waitid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 287, 22, 21), //add_key BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 291, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 289, 22, 21), //keyctl -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 294, 21, 20), //inotify_init|inotify_add_watch|inotify_rm_watch +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 289, 20, 19), //keyctl +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 294, 19, 18), //inotify_init|inotify_add_watch|inotify_rm_watch BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 313, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 300, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 299, 18, 17), //openat|mkdirat|mknodat|fchownat -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 311, 17, 16), //fstatat64|unlinkat|renameat|linkat|symlinkat|readlinkat|fchmodat|faccessat|pselect6|ppoll|unshare -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 318, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 317, 15, 14), //splice|sync_file_range|tee|vmsplice -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 321, 14, 13), //getcpu|epoll_pwait|utimensat -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 350, 7, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 343, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 340, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 337, 10, 9), //timerfd_create|eventfd|fallocate|timerfd_settime|timerfd_gettime|signalfd4|eventfd2|epoll_create1|dup3|pipe2|inotify_init1|preadv|pwritev|rt_tgsigqueueinfo|perf_event_open -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 341, 9, 8), //prlimit64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 346, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 345, 7, 6), //clock_adjtime|syncfs -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 349, 6, 5), //setns|process_vm_readv|process_vm_writev +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 299, 16, 15), //openat|mkdirat|mknodat|fchownat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 311, 15, 14), //fstatat64|unlinkat|renameat|linkat|symlinkat|readlinkat|fchmodat|faccessat|pselect6|ppoll|unshare +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 317, 14, 13), //splice|sync_file_range|tee|vmsplice +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 346, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 340, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 322, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 321, 10, 9), //getcpu|epoll_pwait|utimensat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 337, 9, 8), //timerfd_create|eventfd|fallocate|timerfd_settime|timerfd_gettime|signalfd4|eventfd2|epoll_create1|dup3|pipe2|inotify_init1|preadv|pwritev|rt_tgsigqueueinfo|perf_event_open +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 343, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 341, 7, 6), //prlimit64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 345, 6, 5), //clock_adjtime|syncfs BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 376, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 358, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 357, 3, 2), //finit_module|sched_setattr|sched_getattr|renameat2|seccomp|getrandom|memfd_create -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 359, 2, 1), //execveat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 350, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 349, 3, 2), //setns|process_vm_readv|process_vm_writev +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 359, 2, 1), //finit_module|sched_setattr|sched_getattr|renameat2|seccomp|getrandom|memfd_create|bpf|execveat BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 380, 1, 0), //mlock2|copy_file_range|preadv2|pwritev2 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), }; diff --git a/libc/seccomp/x86_system_policy.cpp b/libc/seccomp/x86_system_policy.cpp index b45e609b6..3a34c6983 100644 --- a/libc/seccomp/x86_system_policy.cpp +++ b/libc/seccomp/x86_system_policy.cpp @@ -5,121 +5,119 @@ #include "seccomp_bpfs.h" const sock_filter x86_system_filter[] = { -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 0, 0, 116), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 0, 0, 114), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 131, 57, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 66, 29, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 41, 15, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 24, 7, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 10, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 8, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 7, 109, 108), //restart_syscall|exit|fork|read|write|open|close -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 9, 108, 107), //creat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 7, 107, 106), //restart_syscall|exit|fork|read|write|open|close +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 9, 106, 105), //creat BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 19, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 13, 106, 105), //unlink|execve|chdir -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 22, 105, 104), //lseek|getpid|mount +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 13, 104, 103), //unlink|execve|chdir +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 22, 103, 102), //lseek|getpid|mount BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 33, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 26, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 25, 102, 101), //getuid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 27, 101, 100), //ptrace +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 25, 100, 99), //getuid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 27, 99, 98), //ptrace BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 36, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 34, 99, 98), //access -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 40, 98, 97), //sync|kill|rename|mkdir +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 34, 97, 96), //access +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 40, 96, 95), //sync|kill|rename|mkdir BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 57, 7, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 51, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 45, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 44, 94, 93), //dup|pipe|times -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 46, 93, 92), //brk +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 44, 92, 91), //dup|pipe|times +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 46, 91, 90), //brk BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 54, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 53, 91, 90), //acct|umount2 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 56, 90, 89), //ioctl|fcntl +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 53, 89, 88), //acct|umount2 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 56, 88, 87), //ioctl|fcntl BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 63, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 60, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 58, 87, 86), //setpgid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 62, 86, 85), //umask|chroot -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 65, 85, 84), //dup2|getppid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 58, 85, 84), //setpgid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 62, 84, 83), //umask|chroot +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 65, 83, 82), //dup2|getppid BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 96, 13, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 88, 7, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 77, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 74, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 68, 80, 79), //setsid|sigaction -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 76, 79, 78), //sethostname|setrlimit +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 68, 78, 77), //setsid|sigaction +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 76, 77, 76), //sethostname|setrlimit BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 85, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 80, 77, 76), //getrusage|gettimeofday|settimeofday -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 86, 76, 75), //readlink +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 80, 75, 74), //getrusage|gettimeofday|settimeofday +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 86, 74, 73), //readlink BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 94, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 90, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 89, 73, 72), //reboot -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 93, 72, 71), //mmap|munmap|truncate -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 95, 71, 70), //fchmod +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 89, 71, 70), //reboot +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 93, 70, 69), //mmap|munmap|truncate +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 95, 69, 68), //fchmod BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 118, 7, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 114, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 102, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 98, 67, 66), //getpriority|setpriority -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 106, 66, 65), //socketcall|syslog|setitimer|getitimer +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 98, 65, 64), //getpriority|setpriority +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 106, 64, 63), //socketcall|syslog|setitimer|getitimer BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 116, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 115, 64, 63), //wait4 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 117, 63, 62), //sysinfo +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 115, 62, 61), //wait4 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 117, 61, 60), //sysinfo BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 128, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 124, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 123, 60, 59), //fsync|sigreturn|clone|setdomainname|uname -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 126, 59, 58), //adjtimex|mprotect -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 130, 58, 57), //init_module|delete_module -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 272, 29, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 199, 15, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 123, 58, 57), //fsync|sigreturn|clone|setdomainname|uname +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 126, 57, 56), //adjtimex|mprotect +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 130, 56, 55), //init_module|delete_module +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 254, 27, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 190, 13, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 168, 7, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 138, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 136, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 134, 52, 51), //quotactl|getpgid|fchdir -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 137, 51, 50), //personality +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 134, 50, 49), //quotactl|getpgid|fchdir +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 137, 49, 48), //personality BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 150, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 149, 49, 48), //setfsuid|setfsgid|_llseek|getdents|_newselect|flock|msync|readv|writev|getsid|fdatasync -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 164, 48, 47), //mlock|munlock|mlockall|munlockall|sched_setparam|sched_getparam|sched_setscheduler|sched_getscheduler|sched_yield|sched_get_priority_max|sched_get_priority_min|sched_rr_get_interval|nanosleep|mremap +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 149, 47, 46), //setfsuid|setfsgid|_llseek|getdents|_newselect|flock|msync|readv|writev|getsid|fdatasync +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 164, 46, 45), //mlock|munlock|mlockall|munlockall|sched_setparam|sched_getparam|sched_setscheduler|sched_getscheduler|sched_yield|sched_get_priority_max|sched_get_priority_min|sched_rr_get_interval|nanosleep|mremap BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 183, 3, 0), BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 172, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 169, 45, 44), //poll -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 182, 44, 43), //prctl|rt_sigreturn|rt_sigaction|rt_sigprocmask|rt_sigpending|rt_sigtimedwait|rt_sigqueueinfo|rt_sigsuspend|pread64|pwrite64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 190, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 188, 42, 41), //getcwd|capget|capset|sigaltstack|sendfile -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 198, 41, 40), //vfork|ugetrlimit|mmap2|truncate64|ftruncate64|stat64|lstat64|fstat64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 245, 7, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 218, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 213, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 212, 37, 36), //getuid32|getgid32|geteuid32|getegid32|setreuid32|setregid32|getgroups32|setgroups32|fchown32|setresuid32|getresuid32|setresgid32|getresgid32 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 215, 36, 35), //setuid32|setgid32 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 224, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 222, 34, 33), //mincore|madvise|getdents64|fcntl64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 244, 33, 32), //gettid|readahead|setxattr|lsetxattr|fsetxattr|getxattr|lgetxattr|fgetxattr|listxattr|llistxattr|flistxattr|removexattr|lremovexattr|fremovexattr|tkill|sendfile64|futex|sched_setaffinity|sched_getaffinity|set_thread_area -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 254, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 252, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 250, 30, 29), //io_setup|io_destroy|io_getevents|io_submit|io_cancel -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 253, 29, 28), //exit_group -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 271, 28, 27), //epoll_create|epoll_ctl|epoll_wait|remap_file_pages|set_tid_address|timer_create|timer_settime|timer_gettime|timer_getoverrun|timer_delete|clock_settime|clock_gettime|clock_getres|clock_nanosleep|statfs64|fstatfs64|tgkill -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 322, 13, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 300, 7, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 291, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 284, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 273, 23, 22), //fadvise64_64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 285, 22, 21), //waitid -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 295, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 294, 20, 19), //inotify_init|inotify_add_watch|inotify_rm_watch -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 299, 19, 18), //openat|mkdirat|mknodat|fchownat -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 318, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 313, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 311, 16, 15), //fstatat64|unlinkat|renameat|linkat|symlinkat|readlinkat|fchmodat|faccessat|pselect6|ppoll|unshare -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 317, 15, 14), //splice|sync_file_range|tee|vmsplice -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 321, 14, 13), //getcpu|epoll_pwait|utimensat -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 351, 7, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 343, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 340, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 337, 10, 9), //timerfd_create|eventfd|fallocate|timerfd_settime|timerfd_gettime|signalfd4|eventfd2|epoll_create1|dup3|pipe2|inotify_init1|preadv|pwritev|rt_tgsigqueueinfo|perf_event_open -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 341, 9, 8), //prlimit64 -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 346, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 345, 7, 6), //clock_adjtime|syncfs -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 349, 6, 5), //setns|process_vm_readv|process_vm_writev +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 169, 43, 42), //poll +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 182, 42, 41), //prctl|rt_sigreturn|rt_sigaction|rt_sigprocmask|rt_sigpending|rt_sigtimedwait|rt_sigqueueinfo|rt_sigsuspend|pread64|pwrite64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 188, 41, 40), //getcwd|capget|capset|sigaltstack|sendfile +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 224, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 213, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 199, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 198, 37, 36), //vfork|ugetrlimit|mmap2|truncate64|ftruncate64|stat64|lstat64|fstat64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 212, 36, 35), //getuid32|getgid32|geteuid32|getegid32|setreuid32|setregid32|getgroups32|setgroups32|fchown32|setresuid32|getresuid32|setresgid32|getresgid32 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 218, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 215, 34, 33), //setuid32|setgid32 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 222, 33, 32), //mincore|madvise|getdents64|fcntl64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 252, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 245, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 244, 30, 29), //gettid|readahead|setxattr|lsetxattr|fsetxattr|getxattr|lgetxattr|fgetxattr|listxattr|llistxattr|flistxattr|removexattr|lremovexattr|fremovexattr|tkill|sendfile64|futex|sched_setaffinity|sched_getaffinity|set_thread_area +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 250, 29, 28), //io_setup|io_destroy|io_getevents|io_submit|io_cancel +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 253, 28, 27), //exit_group +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 318, 13, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 295, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 284, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 272, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 271, 23, 22), //epoll_create|epoll_ctl|epoll_wait|remap_file_pages|set_tid_address|timer_create|timer_settime|timer_gettime|timer_getoverrun|timer_delete|clock_settime|clock_gettime|clock_getres|clock_nanosleep|statfs64|fstatfs64|tgkill +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 273, 22, 21), //fadvise64_64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 291, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 285, 20, 19), //waitid +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 294, 19, 18), //inotify_init|inotify_add_watch|inotify_rm_watch +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 313, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 300, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 299, 16, 15), //openat|mkdirat|mknodat|fchownat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 311, 15, 14), //fstatat64|unlinkat|renameat|linkat|symlinkat|readlinkat|fchmodat|faccessat|pselect6|ppoll|unshare +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 317, 14, 13), //splice|sync_file_range|tee|vmsplice +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 346, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 340, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 322, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 321, 10, 9), //getcpu|epoll_pwait|utimensat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 337, 9, 8), //timerfd_create|eventfd|fallocate|timerfd_settime|timerfd_gettime|signalfd4|eventfd2|epoll_create1|dup3|pipe2|inotify_init1|preadv|pwritev|rt_tgsigqueueinfo|perf_event_open +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 343, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 341, 7, 6), //prlimit64 +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 345, 6, 5), //clock_adjtime|syncfs BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 376, 3, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 358, 1, 0), -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 357, 3, 2), //sched_setattr|sched_getattr|renameat2|seccomp|getrandom|memfd_create -BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 359, 2, 1), //execveat +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 351, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 349, 3, 2), //setns|process_vm_readv|process_vm_writev +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 359, 2, 1), //sched_setattr|sched_getattr|renameat2|seccomp|getrandom|memfd_create|bpf|execveat BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 380, 1, 0), //mlock2|copy_file_range|preadv2|pwritev2 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), }; diff --git a/libc/stdio/vfscanf.c b/libc/stdio/vfscanf.cpp index f0ed4ae71..49d6bf6f9 100644 --- a/libc/stdio/vfscanf.c +++ b/libc/stdio/vfscanf.cpp @@ -37,74 +37,68 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <sys/param.h> #include <wctype.h> #include "local.h" #include <private/bionic_ctype.h> +#include <private/bionic_fortify.h> +#include <private/bionic_mbstate.h> #define BUF 513 /* Maximum length of numeric string. */ -/* - * Flags used during conversion. - */ -#define LONG 0x00001 /* l: long or double */ -#define LONGDBL 0x00002 /* L: long double */ -#define SHORT 0x00004 /* h: short */ -#define SHORTSHORT 0x00008 /* hh: 8 bit integer */ -#define LLONG 0x00010 /* ll: long long (+ deprecated q: quad) */ -#define POINTER 0x00020 /* p: void * (as hex) */ -#define SIZEINT 0x00040 /* z: (signed) size_t */ -#define MAXINT 0x00080 /* j: intmax_t */ -#define PTRINT 0x00100 /* t: ptrdiff_t */ -#define NOSKIP 0x00200 /* [ or c: do not skip blanks */ -#define SUPPRESS 0x00400 /* *: suppress assignment */ -#define UNSIGNED 0x00800 /* %[oupxX] conversions */ - -/* - * The following are used in numeric conversions only: - * SIGNOK, HAVESIGN, NDIGITS, DPTOK, and EXPOK are for floating point; - * SIGNOK, HAVESIGN, NDIGITS, PFXOK, and NZDIGITS are for integral. - */ -#define SIGNOK 0x01000 /* +/- is (still) legal */ -#define HAVESIGN 0x02000 /* sign detected */ -#define NDIGITS 0x04000 /* no digits detected */ - -#define DPTOK 0x08000 /* (float) decimal point is still legal */ -#define EXPOK 0x10000 /* (float) exponent (e+3, etc) still legal */ - -#define PFXOK 0x08000 /* 0x prefix is (still) legal */ -#define NZDIGITS 0x10000 /* no zero digits detected */ - -/* - * Conversion types. - */ -#define CT_CHAR 0 /* %c conversion */ -#define CT_CCL 1 /* %[...] conversion */ -#define CT_STRING 2 /* %s conversion */ -#define CT_INT 3 /* integer, i.e., strtoimax or strtoumax */ -#define CT_FLOAT 4 /* floating, i.e., strtod */ - -static u_char* __sccl(char*, u_char*); +// Flags used during conversion. +// Size/type: +#define LONG 0x00001 // l: long or double +#define LONGDBL 0x00002 // L: long double +#define SHORT 0x00004 // h: short +#define SHORTSHORT 0x00008 // hh: 8 bit integer +#define LLONG 0x00010 // ll: long long (+ deprecated q: quad) +#define POINTER 0x00020 // p: void* (as hex) +#define SIZEINT 0x00040 // z: (signed) size_t +#define MAXINT 0x00080 // j: intmax_t +#define PTRINT 0x00100 // t: ptrdiff_t +#define NOSKIP 0x00200 // [ or c: do not skip blanks +// Modifiers: +#define SUPPRESS 0x00400 // *: suppress assignment +#define UNSIGNED 0x00800 // %[oupxX] conversions +#define ALLOCATE 0x01000 // m: allocate a char* +// Internal use during integer parsing: +#define SIGNOK 0x02000 // +/- is (still) legal +#define HAVESIGN 0x04000 // Sign detected +#define NDIGITS 0x08000 // No digits detected +#define PFXOK 0x10000 // "0x" prefix is (still) legal +#define NZDIGITS 0x20000 // No zero digits detected + +// Conversion types. +#define CT_CHAR 0 // %c conversion +#define CT_CCL 1 // %[...] conversion +#define CT_STRING 2 // %s conversion +#define CT_INT 3 // Integer: strtoimax/strtoumax +#define CT_FLOAT 4 // Float: strtod + +static const unsigned char* __sccl(char*, const unsigned char*); /* * Internal, unlocked version of vfscanf */ -int __svfscanf(FILE* fp, const char* fmt0, __va_list ap) { - u_char* fmt = (u_char*)fmt0; +int __svfscanf(FILE* fp, const char* fmt0, va_list ap) { + const unsigned char* fmt = reinterpret_cast<const unsigned char*>(fmt0); int c; /* character from format, or conversion */ size_t width; /* field width, or 0 */ - char* p; /* points into all kinds of strings */ - int n; /* handy integer */ + char* p; + wchar_t* wcp; + size_t n; int flags; /* flags as defined above */ - char* p0; /* saves original value of p when necessary */ int nassigned; /* number of fields assigned */ int nread; /* number of characters consumed from fp */ int base; /* base argument to strtoimax/strtouimax */ char ccltab[256]; /* character class table for %[...] */ char buf[BUF]; /* buffer for numeric conversions */ - wchar_t* wcp; /* handy wide character pointer */ size_t nconv; /* length of multibyte sequence converted */ mbstate_t mbs; + void* allocation = NULL; // Allocated but unassigned result for %mc/%ms/%m[. + size_t capacity = 0; // Number of char/wchar_t units allocated in `allocation`. /* `basefix' is used to avoid `if' tests in the integer scanner */ static short basefix[17] = { 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }; @@ -113,10 +107,9 @@ int __svfscanf(FILE* fp, const char* fmt0, __va_list ap) { nassigned = 0; nread = 0; - base = 0; /* XXX just to keep gcc happy */ for (;;) { c = *fmt++; - if (c == 0) return (nassigned); + if (c == 0) return nassigned; if (IsSpace(c)) { while ((fp->_r > 0 || __srefill(fp) == 0) && IsSpace(*fp->_p)) nread++, fp->_r--, fp->_p++; continue; @@ -164,6 +157,9 @@ literal: flags |= LONG; } goto again; + case 'm': + flags |= ALLOCATE; + goto again; case 'q': flags |= LLONG; /* deprecated */ goto again; @@ -239,6 +235,8 @@ literal: break; case 's': + memset(ccltab, 1, 256); + ccltab['\t'] = ccltab['\n'] = ccltab['\v'] = ccltab['\f'] = ccltab['\r'] = ccltab[' '] = 0; c = CT_STRING; break; @@ -262,29 +260,30 @@ literal: case 'n': if (flags & SUPPRESS) continue; - if (flags & SHORTSHORT) + if (flags & SHORTSHORT) { *va_arg(ap, signed char*) = nread; - else if (flags & SHORT) + } else if (flags & SHORT) { *va_arg(ap, short*) = nread; - else if (flags & LONG) + } else if (flags & LONG) { *va_arg(ap, long*) = nread; - else if (flags & SIZEINT) + } else if (flags & SIZEINT) { *va_arg(ap, ssize_t*) = nread; - else if (flags & PTRINT) + } else if (flags & PTRINT) { *va_arg(ap, ptrdiff_t*) = nread; - else if (flags & LLONG) + } else if (flags & LLONG) { *va_arg(ap, long long*) = nread; - else if (flags & MAXINT) + } else if (flags & MAXINT) { *va_arg(ap, intmax_t*) = nread; - else + } else { *va_arg(ap, int*) = nread; + } continue; /* * Disgusting backwards compatibility hacks. XXX */ case '\0': /* compat */ - return (EOF); + return EOF; default: /* compat */ if (IsUpper(c)) flags |= LONG; @@ -293,6 +292,13 @@ literal: break; } + if ((flags & ALLOCATE) != 0 && c > CT_STRING) { + __fortify_fatal("scanf 'm' only works with %%c/%%s/%%["); + } + if ((flags & (ALLOCATE|SUPPRESS)) == (ALLOCATE|SUPPRESS)) { + __fortify_fatal("scanf 'm' makes no sense with '*'"); + } + /* * We have a conversion that requires input. */ @@ -326,42 +332,53 @@ literal: /* scan arbitrary characters (sets NOSKIP) */ if (width == 0) width = 1; if (flags & LONG) { - wcp = ((flags & SUPPRESS) == 0) ? va_arg(ap, wchar_t*) : NULL; - n = 0; + if (flags & ALLOCATE) { + allocation = wcp = reinterpret_cast<wchar_t*>(malloc(width * sizeof(wchar_t))); + if (allocation == NULL) goto allocation_failure; + } else if (flags & SUPPRESS) { + wcp = NULL; + } else { + wcp = va_arg(ap, wchar_t*); + } + size_t bytes = 0; while (width != 0) { - if (n == (int)MB_CUR_MAX) { + if (bytes == MB_CUR_MAX) { fp->_flags |= __SERR; goto input_failure; } - buf[n++] = *fp->_p; + buf[bytes++] = *fp->_p; fp->_p++; fp->_r--; memset(&mbs, 0, sizeof(mbs)); - nconv = mbrtowc(wcp, buf, n, &mbs); - if (nconv == (size_t)-1) { + nconv = mbrtowc(wcp, buf, bytes, &mbs); + if (nconv == __MB_ERR_ILLEGAL_SEQUENCE) { fp->_flags |= __SERR; goto input_failure; } if (nconv == 0 && !(flags & SUPPRESS)) *wcp = L'\0'; - if (nconv != (size_t)-2) { - nread += n; + if (nconv != __MB_ERR_INCOMPLETE_SEQUENCE) { + nread += bytes; width--; if (!(flags & SUPPRESS)) wcp++; - n = 0; + bytes = 0; } if (fp->_r <= 0 && __srefill(fp)) { - if (n != 0) { + if (bytes != 0) { fp->_flags |= __SERR; goto input_failure; } break; } } + if (allocation != NULL) { + *va_arg(ap, wchar_t**) = reinterpret_cast<wchar_t*>(allocation); + allocation = NULL; + } if (!(flags & SUPPRESS)) nassigned++; } else if (flags & SUPPRESS) { size_t sum = 0; for (;;) { - if ((n = fp->_r) < (int)width) { + if ((n = fp->_r) < width) { sum += n; width -= n; fp->_p += n; @@ -378,9 +395,18 @@ literal: } nread += sum; } else { - size_t r = fread((void*)va_arg(ap, char*), 1, width, fp); - + if (flags & ALLOCATE) { + allocation = p = reinterpret_cast<char*>(malloc(width)); + if (allocation == NULL) goto allocation_failure; + } else { + p = va_arg(ap, char*); + } + size_t r = fread(p, 1, width, fp); if (r == 0) goto input_failure; + if (allocation != NULL) { + *va_arg(ap, char**) = reinterpret_cast<char*>(allocation); + allocation = NULL; + } nread += r; nassigned++; } @@ -390,58 +416,75 @@ literal: case CT_STRING: // CT_CCL: scan a (nonempty) character class (sets NOSKIP). // CT_STRING: like CCL, but zero-length string OK, & no NOSKIP. - if (width == 0) width = (size_t)~0; // 'infinity'. + if (width == 0) width = SIZE_MAX; if (flags & LONG) { - wchar_t twc; - int nchars = 0; - - wcp = (flags & SUPPRESS) == 0 ? va_arg(ap, wchar_t*) : &twc; + // TODO: since no-one cares, replace this with a simple fgetwc loop? n = 0; + if (flags & ALLOCATE) { + capacity = MIN(width, 32); + allocation = wcp = reinterpret_cast<wchar_t*>(malloc(sizeof(wchar_t) * capacity)); + if (allocation == NULL) goto allocation_failure; + } else if (flags & SUPPRESS) { + wcp = NULL; + } else { + wcp = va_arg(ap, wchar_t*); + } + size_t bytes = 0; while ((c == CT_CCL || !IsSpace(*fp->_p)) && width != 0) { - if (n == (int)MB_CUR_MAX) { + if (bytes == MB_CUR_MAX) { fp->_flags |= __SERR; goto input_failure; } - buf[n++] = *fp->_p; + buf[bytes++] = *fp->_p; fp->_p++; fp->_r--; + wchar_t wc = L'\0'; memset(&mbs, 0, sizeof(mbs)); - nconv = mbrtowc(wcp, buf, n, &mbs); - if (nconv == (size_t)-1) { + nconv = mbrtowc(&wc, buf, bytes, &mbs); + if (nconv == __MB_ERR_ILLEGAL_SEQUENCE) { fp->_flags |= __SERR; goto input_failure; } - if (nconv == 0) *wcp = L'\0'; - if (nconv != (size_t)-2) { - if ((c == CT_CCL && wctob(*wcp) != EOF && !ccltab[wctob(*wcp)]) || (c == CT_STRING && iswspace(*wcp))) { - while (n != 0) { - n--; - ungetc(buf[n], fp); + if (nconv != __MB_ERR_INCOMPLETE_SEQUENCE) { + if ((c == CT_CCL && wctob(wc) != EOF && !ccltab[wctob(wc)]) || (c == CT_STRING && iswspace(wc))) { + while (bytes != 0) { + bytes--; + ungetc(buf[bytes], fp); } break; } - nread += n; + if (wcp) wcp[n] = wc; + n++; + if (allocation != NULL && n == capacity) { + capacity *= 2; + wchar_t* new_allocation = + reinterpret_cast<wchar_t*>(realloc(allocation, sizeof(wchar_t) * capacity)); + if (new_allocation == NULL) goto allocation_failure; + allocation = wcp = new_allocation; + } + nread += bytes; width--; - if (!(flags & SUPPRESS)) wcp++; - nchars++; - n = 0; + bytes = 0; } if (fp->_r <= 0 && __srefill(fp)) { - if (n != 0) { + if (bytes != 0) { fp->_flags |= __SERR; goto input_failure; } break; } } - if (c == CT_CCL && n != 0) { + if (c == CT_CCL && bytes != 0) { fp->_flags |= __SERR; goto input_failure; } - n = nchars; + if (allocation != NULL) { + *va_arg(ap, wchar_t**) = reinterpret_cast<wchar_t*>(allocation); + allocation = NULL; + } } else if (flags & SUPPRESS) { n = 0; - while ((c == CT_CCL && ccltab[*fp->_p]) || (c == CT_STRING && !IsSpace(*fp->_p))) { + while (ccltab[*fp->_p]) { n++, fp->_r--, fp->_p++; if (--width == 0) break; if (fp->_r <= 0 && __srefill(fp)) { @@ -449,29 +492,46 @@ literal: break; } } + nread += n; } else { - p0 = p = va_arg(ap, char*); - while ((c == CT_CCL && ccltab[*fp->_p]) || (c == CT_STRING && !IsSpace(*fp->_p))) { + if (flags & ALLOCATE) { + capacity = MIN(width, 32); + allocation = p = reinterpret_cast<char*>(malloc(capacity)); + if (allocation == NULL) goto allocation_failure; + } else { + p = va_arg(ap, char*); + } + n = 0; + while (ccltab[*fp->_p]) { fp->_r--; - *p++ = *fp->_p++; + p[n++] = *fp->_p++; + if (allocation != NULL && n == capacity) { + capacity *= 2; + char* new_allocation = reinterpret_cast<char*>(realloc(allocation, capacity)); + if (new_allocation == NULL) goto allocation_failure; + allocation = p = new_allocation; + } if (--width == 0) break; if (fp->_r <= 0 && __srefill(fp)) { - if (c == CT_CCL && p == p0) goto input_failure; + if (c == CT_CCL && n == 0) goto input_failure; break; } } - n = p - p0; + nread += n; + if (allocation != NULL) { + *va_arg(ap, char**) = reinterpret_cast<char*>(allocation); + allocation = NULL; + } } if (c == CT_CCL && n == 0) goto match_failure; if (!(flags & SUPPRESS)) { if (flags & LONG) { - *wcp = L'\0'; + wcp[n] = L'\0'; } else { - *p = '\0'; + p[n] = '\0'; } ++nassigned; } - nread += n; break; case CT_INT: @@ -610,28 +670,30 @@ literal: uintmax_t res; *p = '\0'; - if (flags & UNSIGNED) + if (flags & UNSIGNED) { res = strtoumax(buf, NULL, base); - else + } else { res = strtoimax(buf, NULL, base); - if (flags & POINTER) + } + if (flags & POINTER) { *va_arg(ap, void**) = (void*)(uintptr_t)res; - else if (flags & MAXINT) + } else if (flags & MAXINT) { *va_arg(ap, intmax_t*) = res; - else if (flags & LLONG) + } else if (flags & LLONG) { *va_arg(ap, long long*) = res; - else if (flags & SIZEINT) + } else if (flags & SIZEINT) { *va_arg(ap, ssize_t*) = res; - else if (flags & PTRINT) + } else if (flags & PTRINT) { *va_arg(ap, ptrdiff_t*) = res; - else if (flags & LONG) + } else if (flags & LONG) { *va_arg(ap, long*) = res; - else if (flags & SHORT) + } else if (flags & SHORT) { *va_arg(ap, short*) = res; - else if (flags & SHORTSHORT) + } else if (flags & SHORTSHORT) { *va_arg(ap, signed char*) = res; - else + } else { *va_arg(ap, int*) = res; + } nassigned++; } nread += p - buf; @@ -659,10 +721,12 @@ literal: break; } } +allocation_failure: input_failure: + free(allocation); if (nassigned == 0) nassigned = -1; match_failure: - return (nassigned); + return nassigned; } /* @@ -671,7 +735,7 @@ match_failure: * closing `]'. The table has a 1 wherever characters should be * considered part of the scanset. */ -static u_char* __sccl(char* tab, u_char* fmt) { +static const unsigned char* __sccl(char* tab, const unsigned char* fmt) { int c, n, v; /* first `clear' the whole table */ @@ -679,10 +743,10 @@ static u_char* __sccl(char* tab, u_char* fmt) { if (c == '^') { v = 1; /* default => accept */ c = *fmt++; /* get new first char */ - } else + } else { v = 0; /* default => reject */ - /* should probably use memset here */ - for (n = 0; n < 256; n++) tab[n] = v; + } + memset(tab, v, 256); if (c == 0) return (fmt - 1); /* format ended before closing ] */ /* @@ -744,7 +808,7 @@ static u_char* __sccl(char* tab, u_char* fmt) { break; case ']': /* end of scanset */ - return (fmt); + return fmt; default: /* just another character */ c = n; diff --git a/libc/system_properties/include/system_properties/system_properties.h b/libc/system_properties/include/system_properties/system_properties.h index c74f875f7..83ac00ce8 100644 --- a/libc/system_properties/include/system_properties/system_properties.h +++ b/libc/system_properties/include/system_properties/system_properties.h @@ -48,7 +48,7 @@ class SystemProperties { SystemProperties() { } // Special constructor for testing that also zero initializes the important members. - SystemProperties(bool initialized) : initialized_(initialized) { + explicit SystemProperties(bool initialized) : initialized_(initialized) { } DISALLOW_COPY_AND_ASSIGN(SystemProperties); diff --git a/libc/tools/genseccomp.py b/libc/tools/genseccomp.py index dad911331..63d9f20e7 100755 --- a/libc/tools/genseccomp.py +++ b/libc/tools/genseccomp.py @@ -192,7 +192,9 @@ ANDROID_APP_SYSCALL_FILES = { "whitelists": [ "SECCOMP_WHITELIST_COMMON.TXT", "SECCOMP_WHITELIST_APP.TXT"], - "blacklists": ["SECCOMP_BLACKLIST_COMMON.TXT"] + "blacklists": [ + "SECCOMP_BLACKLIST_COMMON.TXT", + "SECCOMP_BLACKLIST_APP.TXT"] } ANDROID_GLOBAL_SYSCALL_FILES = { |