aboutsummaryrefslogtreecommitdiff
path: root/nptl
diff options
context:
space:
mode:
authorJohn David Anglin <danglin@gcc.gnu.org>2017-07-15 12:40:13 -0400
committerJohn David Anglin <danglin@gcc.gnu.org>2017-07-15 12:40:13 -0400
commit075385f98af239ff5807a5c6ed17fec51e048454 (patch)
tree4daa5d6e521d62b372bc7e69bc9036d0b61b4b0f /nptl
parent2759a2c1d8b950521ae76e62efe0114fd36b6e2d (diff)
downloadglibc-075385f98af239ff5807a5c6ed17fec51e048454.zip
glibc-075385f98af239ff5807a5c6ed17fec51e048454.tar.gz
glibc-075385f98af239ff5807a5c6ed17fec51e048454.tar.bz2
Fix guard alignment in allocate_stack when stack grows up.
Diffstat (limited to 'nptl')
-rw-r--r--nptl/allocatestack.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/nptl/allocatestack.c b/nptl/allocatestack.c
index ec7d42e..ce2e24a 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