diff mbox series

[1/5] htl: Let Mach place thread stacks

Message ID 20230625231751.404120-1-bugaevc@gmail.com
State New
Headers show
Series [1/5] htl: Let Mach place thread stacks | expand

Commit Message

Sergey Bugaev June 25, 2023, 11:17 p.m. UTC
Instead of trying to allocate a thread stack at a specific address,
looping over the address space, just set the ANYWHERE flag in
vm_allocate (). The previous behavior:

- defeats ASLR (for Mach versions that support ASLR),
- is particularly slow if the lower 4 GB of the address space are mapped
  inaccessible, as we're planning to do on 64-bit Hurd,
- is just silly.

Signed-off-by: Sergey Bugaev <bugaevc@gmail.com>
---
 sysdeps/mach/htl/pt-stack-alloc.c | 35 ++++++-------------------------
 1 file changed, 6 insertions(+), 29 deletions(-)

Comments

Samuel Thibault July 2, 2023, 11:26 p.m. UTC | #1
Applied, thanks!

Sergey Bugaev, le lun. 26 juin 2023 02:17:47 +0300, a ecrit:
> Instead of trying to allocate a thread stack at a specific address,
> looping over the address space, just set the ANYWHERE flag in
> vm_allocate (). The previous behavior:
> 
> - defeats ASLR (for Mach versions that support ASLR),
> - is particularly slow if the lower 4 GB of the address space are mapped
>   inaccessible, as we're planning to do on 64-bit Hurd,
> - is just silly.
> 
> Signed-off-by: Sergey Bugaev <bugaevc@gmail.com>
> ---
>  sysdeps/mach/htl/pt-stack-alloc.c | 35 ++++++-------------------------
>  1 file changed, 6 insertions(+), 29 deletions(-)
> 
> diff --git a/sysdeps/mach/htl/pt-stack-alloc.c b/sysdeps/mach/htl/pt-stack-alloc.c
> index 429ac2d9..97e6b445 100644
> --- a/sysdeps/mach/htl/pt-stack-alloc.c
> +++ b/sysdeps/mach/htl/pt-stack-alloc.c
> @@ -19,14 +19,9 @@
>  #include <errno.h>
>  
>  #include <mach.h>
> -#include <mach/machine/vm_param.h>
>  
>  #include <pt-internal.h>
>  
> -/* The next address to use for stack allocation.  */
> -static vm_address_t next_stack_base = VM_MIN_ADDRESS;
> -
> -
>  /* Allocate a new stack of size STACKSIZE.  If successful, store the
>     address of the newly allocated stack in *STACKADDR and return 0.
>     Otherwise return an error code (EINVAL for an invalid stack size,
> @@ -35,30 +30,12 @@ static vm_address_t next_stack_base = VM_MIN_ADDRESS;
>  int
>  __pthread_stack_alloc (void **stackaddr, size_t stacksize)
>  {
> -  vm_offset_t base;
> -  int i = 0;
> -
> -get_stack:
> -  i++;
> -  for (base = next_stack_base;
> -       base < VM_MAX_ADDRESS
> -       && __vm_allocate (__mach_task_self (), &base,
> -			 stacksize, FALSE) != KERN_SUCCESS; base += stacksize)
> -    ;
> -
> -  if (base >= VM_MAX_ADDRESS)
> -    {
> -      if (i == 1)
> -	{
> -	  next_stack_base = VM_MIN_ADDRESS;
> -	  goto get_stack;
> -	}
> -      else
> -	return EAGAIN;
> -    }
> +  error_t err;
>  
> -  next_stack_base = base + stacksize;
> +  err = __vm_allocate (__mach_task_self (), (vm_offset_t *) stackaddr,
> +		       stacksize, TRUE);
>  
> -  (*stackaddr) = (void *) base;
> -  return 0;
> +  if (err == KERN_NO_SPACE)
> +    err = EAGAIN;
> +  return err;
>  }
> -- 
> 2.41.0
> 
>
diff mbox series

Patch

diff --git a/sysdeps/mach/htl/pt-stack-alloc.c b/sysdeps/mach/htl/pt-stack-alloc.c
index 429ac2d9..97e6b445 100644
--- a/sysdeps/mach/htl/pt-stack-alloc.c
+++ b/sysdeps/mach/htl/pt-stack-alloc.c
@@ -19,14 +19,9 @@ 
 #include <errno.h>
 
 #include <mach.h>
-#include <mach/machine/vm_param.h>
 
 #include <pt-internal.h>
 
-/* The next address to use for stack allocation.  */
-static vm_address_t next_stack_base = VM_MIN_ADDRESS;
-
-
 /* Allocate a new stack of size STACKSIZE.  If successful, store the
    address of the newly allocated stack in *STACKADDR and return 0.
    Otherwise return an error code (EINVAL for an invalid stack size,
@@ -35,30 +30,12 @@  static vm_address_t next_stack_base = VM_MIN_ADDRESS;
 int
 __pthread_stack_alloc (void **stackaddr, size_t stacksize)
 {
-  vm_offset_t base;
-  int i = 0;
-
-get_stack:
-  i++;
-  for (base = next_stack_base;
-       base < VM_MAX_ADDRESS
-       && __vm_allocate (__mach_task_self (), &base,
-			 stacksize, FALSE) != KERN_SUCCESS; base += stacksize)
-    ;
-
-  if (base >= VM_MAX_ADDRESS)
-    {
-      if (i == 1)
-	{
-	  next_stack_base = VM_MIN_ADDRESS;
-	  goto get_stack;
-	}
-      else
-	return EAGAIN;
-    }
+  error_t err;
 
-  next_stack_base = base + stacksize;
+  err = __vm_allocate (__mach_task_self (), (vm_offset_t *) stackaddr,
+		       stacksize, TRUE);
 
-  (*stackaddr) = (void *) base;
-  return 0;
+  if (err == KERN_NO_SPACE)
+    err = EAGAIN;
+  return err;
 }