OSDN Git Service

Revert "add guard pages to the internal signal stacks"
authorElliott Hughes <enh@google.com>
Tue, 31 Mar 2015 02:42:39 +0000 (02:42 +0000)
committerElliott Hughes <enh@google.com>
Tue, 31 Mar 2015 02:42:39 +0000 (02:42 +0000)
This reverts commit 595752f623ae88f7e4193a6e531a0805f1c6c4dc.

Change-Id: Iefa66e9049ca0424e53cd5fc320d161b93556dcb

libc/bionic/pthread_create.cpp
libc/bionic/pthread_exit.cpp
libc/bionic/pthread_internal.h

index 179ae95..66632c4 100644 (file)
@@ -69,23 +69,17 @@ void __init_tls(pthread_internal_t* thread) {
 
 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");
   }
 }
 
index ceda931..1de85f5 100644 (file)
@@ -87,7 +87,7 @@ void pthread_exit(void* return_value) {
     sigaltstack(&ss, NULL);
 
     // Free it.
-    munmap(thread->alternate_signal_stack, SIGNAL_STACK_SIZE);
+    munmap(thread->alternate_signal_stack, SIGSTKSZ);
     thread->alternate_signal_stack = NULL;
   }
 
index 3b91e6a..2151e03 100644 (file)
@@ -130,9 +130,6 @@ __LIBC_HIDDEN__ void pthread_key_clean_all(void);
  */
 #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();