From aab7cb2d968eb4bb1c00029c911cfe25a4c733a2 Mon Sep 17 00:00:00 2001 From: GNU Libc Maintainers Date: Mon, 16 Jan 2017 17:43:37 +0000 Subject: [PATCH] local-stack-grows-up Gbp-Pq: Topic hppa Gbp-Pq: Name local-stack-grows-up.diff --- nptl/allocatestack.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/nptl/allocatestack.c b/nptl/allocatestack.c index 6b42b11d5..f8d989d0d 100644 --- a/nptl/allocatestack.c +++ b/nptl/allocatestack.c @@ -691,9 +691,13 @@ 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) - goto mprot_error; + 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 (old_guard - new_guard > 0) + if (mprotect (old_guard, new_guard - old_guard, prot) != 0) + goto mprot_error; #endif pd->guardsize = guardsize; -- 2.30.2