the sandbox caching of thread id's only works with glibc see: https://gitlab.alpinelinux.org/alpine/aports/-/merge_requests/32356 see: https://gitlab.alpinelinux.org/alpine/aports/-/issues/13579 -- --- a/sandbox/linux/services/namespace_sandbox.cc +++ b/sandbox/linux/services/namespace_sandbox.cc @@ -209,6 +209,70 @@ return base::LaunchProcess(argv, launch_options_copy); } +#if defined(__aarch64__) +#define TLS_ABOVE_TP +#endif + +struct musl_pthread +{ + /* Part 1 -- these fields may be external or + * internal (accessed via asm) ABI. Do not change. */ + struct pthread *self; +#ifndef TLS_ABOVE_TP + uintptr_t *dtv; +#endif + struct pthread *prev, *next; /* non-ABI */ + uintptr_t sysinfo; +#ifndef TLS_ABOVE_TP +#ifdef CANARY_PAD + uintptr_t canary_pad; +#endif + uintptr_t canary; +#endif + +/* Part 2 -- implementation details, non-ABI. */ + int tid; + int errno_val; + volatile int detach_state; + volatile int cancel; + volatile unsigned char canceldisable, cancelasync; + unsigned char tsd_used:1; + unsigned char dlerror_flag:1; + unsigned char *map_base; + size_t map_size; + void *stack; + size_t stack_size; + size_t guard_size; + void *result; + struct __ptcb *cancelbuf; + void **tsd; + struct { + volatile void *volatile head; + long off; + volatile void *volatile pending; + } robust_list; + int h_errno_val; + volatile int timer_id; + locale_t locale; + volatile int killlock[1]; + char *dlerror_buf; + void *stdio_locks; + + /* Part 3 -- the positions of these fields relative to + * the end of the structure is external and internal ABI. */ +#ifdef TLS_ABOVE_TP + uintptr_t canary; + uintptr_t *dtv; +#endif +}; + +void MaybeUpdateMuslTidCache() +{ + pid_t real_tid = sys_gettid(); + pid_t* cached_tid_location = &reinterpret_cast(pthread_self())->tid; + *cached_tid_location = real_tid; +} + // static pid_t NamespaceSandbox::ForkInNewPidNamespace(bool drop_capabilities_in_child) { const pid_t pid = @@ -226,6 +290,7 @@ #if defined(LIBC_GLIBC) MaybeUpdateGlibcTidCache(); #endif + MaybeUpdateMuslTidCache(); return 0; }