]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
htl: Respect GL(dl_stack_flags) when allocating stacks
authorSergey Bugaev <bugaevc@gmail.com>
Sat, 23 Mar 2024 17:32:47 +0000 (20:32 +0300)
committerSamuel Thibault <samuel.thibault@ens-lyon.org>
Sat, 23 Mar 2024 21:48:44 +0000 (22:48 +0100)
Previously, HTL would always allocate non-executable stacks.  This has
never been noticed, since GNU Mach on x86 ignores VM_PROT_EXECUTE and
makes all pages implicitly executable.  Since GNU Mach on AArch64
supports non-executable pages, HTL forgetting to pass VM_PROT_EXECUTE
immediately breaks any code that (unfortunately, still) relies on
executable stacks.

Signed-off-by: Sergey Bugaev <bugaevc@gmail.com>
Message-ID: <20240323173301.151066-7-bugaevc@gmail.com>

sysdeps/htl/Versions
sysdeps/mach/htl/pt-stack-alloc.c

index 3a3b1e8b3d034e00a54490ed69d0ad5775e32475..7b5450d20efdab893165e6a9e3ddaa3f3a545135 100644 (file)
@@ -12,4 +12,8 @@ libc {
     pthread_spin_destroy; pthread_spin_init; pthread_spin_lock;
     pthread_spin_trylock; pthread_spin_unlock;
   }
+
+  GLIBC_PRIVATE {
+    __vm_map;
+  }
 }
index 61974bd571c9486c583856ea1018fd401a973374..0597770bab5f67f49f8a9560ef061cf491cc4286 100644 (file)
@@ -31,9 +31,14 @@ int
 __pthread_stack_alloc (void **stackaddr, size_t stacksize)
 {
   error_t err;
+  vm_prot_t prot = VM_PROT_READ | VM_PROT_WRITE;
 
-  err = __vm_allocate (__mach_task_self (), (vm_offset_t *) stackaddr,
-                      stacksize, TRUE);
+  if (GL(dl_stack_flags) & PF_X)
+    prot |= VM_PROT_EXECUTE;
+
+  err = __vm_map (__mach_task_self (), (vm_offset_t *) stackaddr,
+                 stacksize, 0, TRUE, MEMORY_OBJECT_NULL, 0, FALSE,
+                 prot, VM_PROT_ALL, VM_INHERIT_COPY);
 
   if (err == KERN_NO_SPACE)
     err = EAGAIN;