void __init_alternate_signal_stack(pthread_internal_t* thread) {
// Create and set an alternate signal stack.
- void* stack_base = mmap(NULL, SIGNAL_STACK_SIZE, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
- if (stack_base != MAP_FAILED) {
- // Create a guard page to catch stack overflows in signal handlers.
- if (mprotect(stack_base, PAGE_SIZE, PROT_NONE) == -1) {
- munmap(stack_base, SIGNAL_STACK_SIZE);
- return;
- }
- stack_t ss;
- ss.ss_sp = stack_base + PAGE_SIZE;
- ss.ss_size = SIGNAL_STACK_SIZE - PAGE_SIZE;
+ stack_t ss;
+ ss.ss_sp = mmap(NULL, SIGSTKSZ, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
+ if (ss.ss_sp != MAP_FAILED) {
+ ss.ss_size = SIGSTKSZ;
ss.ss_flags = 0;
sigaltstack(&ss, NULL);
- thread->alternate_signal_stack = stack_base;
+ thread->alternate_signal_stack = ss.ss_sp;
// We can only use const static allocated string for mapped region name, as Android kernel
// uses the string pointer directly when dumping /proc/pid/maps.
- prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, stack_base, SIGNAL_STACK_SIZE, "thread signal stack");
+ prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, ss.ss_sp, ss.ss_size, "thread signal stack");
}
}
*/
#define PTHREAD_STACK_SIZE_DEFAULT ((1 * 1024 * 1024) - SIGSTKSZ)
-/* Leave room for a guard page in the internally created signal stacks. */
-#define SIGNAL_STACK_SIZE (SIGSTKSZ + PAGE_SIZE)
-
/* Needed by fork. */
__LIBC_HIDDEN__ extern void __bionic_atfork_run_prepare();
__LIBC_HIDDEN__ extern void __bionic_atfork_run_child();