From: John David Anglin Date: Sat, 15 Jul 2017 16:40:13 +0000 (-0400) Subject: Fix guard alignment in allocate_stack when stack grows up. X-Git-Tag: glibc-2.26~91 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=075385f98af239ff5807a5c6ed17fec51e048454;p=thirdparty%2Fglibc.git Fix guard alignment in allocate_stack when stack grows up. --- diff --git a/ChangeLog b/ChangeLog index b6befe23294..41c050e0a34 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2017-07-15 John David Anglin + * 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 diff --git a/nptl/allocatestack.c b/nptl/allocatestack.c index ec7d42e027b..ce2e24af951 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