2023-05-05 05:10:04 +00:00
|
|
|
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
|
|
|
|
--
|
2023-01-11 00:40:45 +00:00
|
|
|
--- 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<struct musl_pthread*>(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;
|
|
|
|
}
|
|
|
|
|