aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/unix/sysv/linux/dl-execstack.c
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/sysv/linux/dl-execstack.c')
-rw-r--r--sysdeps/unix/sysv/linux/dl-execstack.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/sysdeps/unix/sysv/linux/dl-execstack.c b/sysdeps/unix/sysv/linux/dl-execstack.c
index 3ca9b0b835..c2b964bf7f 100644
--- a/sysdeps/unix/sysv/linux/dl-execstack.c
+++ b/sysdeps/unix/sysv/linux/dl-execstack.c
@@ -28,6 +28,14 @@
#include "kernel-features.h"
+int __stack_prot attribute_hidden attribute_relro
+#if _STACK_GROWS_DOWN
+ = PROT_READ|PROT_WRITE|PROT_GROWSDOWN;
+#elif _STACK_GROWS_UP
+ = PROT_READ|PROT_WRITE|PROT_GROWSUP;
+#endif
+
+
int
internal_function
_dl_make_stack_executable (void **stack_endp)
@@ -51,8 +59,7 @@ _dl_make_stack_executable (void **stack_endp)
# endif
{
if (__builtin_expect (__mprotect ((void *) page, GLRO(dl_pagesize),
- PROT_READ|PROT_WRITE|PROT_EXEC
- |PROT_GROWSDOWN) == 0, 1))
+ __stack_prot) == 0, 1))
goto return_success;
# if __ASSUME_PROT_GROWSUPDOWN == 0
if (errno == EINVAL)
@@ -76,7 +83,7 @@ _dl_make_stack_executable (void **stack_endp)
while (1)
{
if (__mprotect ((void *) page, size,
- PROT_READ|PROT_WRITE|PROT_EXEC) == 0)
+ __stack_prot & ~PROT_GROWSDOWN) == 0)
/* We got this chunk changed; loop to do another chunk below. */
page -= size;
else