diff options
-rw-r--r-- | ChangeLog | 3 | ||||
-rw-r--r-- | nptl/allocatestack.c | 10 |
2 files changed, 11 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog index b6befe2329..41c050e0a3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2017-07-15 John David Anglin <danglin@gcc.gnu.org> + * nptl/allocatestack.c (allocate_stack): Align old and new guard + addresses to page boundaries when the stack grows up. + * sysdeps/hppa/math-tests.h: New. 2017-07-14 DJ Delorie <dj@redhat.com> diff --git a/nptl/allocatestack.c b/nptl/allocatestack.c index ec7d42e027..ce2e24af95 100644 --- a/nptl/allocatestack.c +++ b/nptl/allocatestack.c @@ -697,8 +697,14 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp, prot) != 0) goto mprot_error; #elif _STACK_GROWS_UP - if (__mprotect ((char *) pd - pd->guardsize, - pd->guardsize - guardsize, prot) != 0) + char *new_guard = (char *)(((uintptr_t) pd - guardsize) + & ~pagesize_m1); + char *old_guard = (char *)(((uintptr_t) pd - pd->guardsize) + & ~pagesize_m1); + /* The guard size difference might be > 0, but once rounded + to the nearest page the size difference might be zero. */ + if (new_guard > old_guard + && mprotect (old_guard, new_guard - old_guard, prot) != 0) goto mprot_error; #endif |