bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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


From: Samuel Thibault
Subject: Re: [PATCH 1/5] htl: Let Mach place thread stacks
Date: Mon, 3 Jul 2023 01:26:24 +0200
User-agent: NeoMutt/20170609 (1.8.3)

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
> 
> 

-- 
Samuel
---
Pour une évaluation indépendante, transparente et rigoureuse !
Je soutiens la Commission d'Évaluation de l'Inria.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]