summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2014-08-20 21:07:27 +0200
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2014-08-20 21:07:27 +0200
commitf36cd8dcb352f7978e9fceb1b512e08a4e296049 (patch)
tree69b2659c99bd49bbe3e92802c9c79b620021330a
parentf517024dce3e21c525a7b634eab61302d6b99150 (diff)
Fix guard size computation
* pthread/pt-create.c (__pthread_create_internal): On thread creation failure, take guard size into account when deallocating the stack. * sysdeps/mach/pt-thread-terminate.c (__pthread_thread_terminate): Take guard size into account when deallocating the stack.
-rw-r--r--pthread/pt-create.c5
-rw-r--r--sysdeps/mach/pt-thread-terminate.c4
2 files changed, 7 insertions, 2 deletions
diff --git a/pthread/pt-create.c b/pthread/pt-create.c
index 00884b5..78dd17e 100644
--- a/pthread/pt-create.c
+++ b/pthread/pt-create.c
@@ -227,7 +227,10 @@ __pthread_create_internal (struct __pthread **thread,
goto failed;
failed_thread_alloc:
if (pthread->stack)
- __pthread_stack_dealloc (pthread->stackaddr, pthread->stacksize);
+ __pthread_stack_dealloc (pthread->stackaddr,
+ ((setup->guardsize + __vm_page_size-1)
+ / __vm_page_size) * __vm_page_size
+ + pthread->stacksize);
failed_stack_alloc:
__pthread_dealloc (pthread);
failed:
diff --git a/sysdeps/mach/pt-thread-terminate.c b/sysdeps/mach/pt-thread-terminate.c
index 6672065..cb9e26a 100644
--- a/sysdeps/mach/pt-thread-terminate.c
+++ b/sysdeps/mach/pt-thread-terminate.c
@@ -42,7 +42,9 @@ __pthread_thread_terminate (struct __pthread *thread)
if (thread->stack)
{
stackaddr = thread->stackaddr;
- stacksize = thread->stacksize;
+ stacksize = ((thread->guardsize + __vm_page_size-1)
+ / __vm_page_size) * __vm_page_size
+ + thread->stacksize;
}
else
{