mirror of
				https://gitlab.alpinelinux.org/alpine/aports.git
				synced 2025-10-31 16:31:40 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			82 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| --- 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;
 | |
|    }
 | |
|  
 |