1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-06-12 08:21:58 +03:00
This commit is contained in:
Jakub Jelinek
2007-07-12 18:26:36 +00:00
parent 7d58530341
commit 0ecb606cb6
6215 changed files with 494638 additions and 305010 deletions

View File

@ -1,5 +1,5 @@
/* Stack executability handling for GNU dynamic linker. Linux version.
Copyright (C) 2003, 2004 Free Software Foundation, Inc.
Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -24,8 +24,9 @@
#include <stdbool.h>
#include <stackinfo.h>
#include <caller.h>
#include <sysdep.h>
#include "kernel-features.h"
#include <kernel-features.h>
extern int __stack_prot attribute_relro attribute_hidden;
@ -38,6 +39,7 @@ _dl_make_stack_executable (void **stack_endp)
/* This gives us the highest/lowest page that needs to be changed. */
uintptr_t page = ((uintptr_t) *stack_endp
& -(intptr_t) GLRO(dl_pagesize));
int result = 0;
/* Challenge the caller. */
if (__builtin_expect (__check_caller (RETURN_ADDRESS (0),
@ -60,7 +62,10 @@ _dl_make_stack_executable (void **stack_endp)
no_growsupdown = true;
else
# endif
return errno;
{
result = errno;
goto out;
}
}
#endif
@ -85,7 +90,10 @@ _dl_make_stack_executable (void **stack_endp)
else
{
if (errno != ENOMEM) /* Unexpected failure mode. */
return errno;
{
result = errno;
goto out;
}
if (size == GLRO(dl_pagesize))
/* We just tried to mprotect the top hole page and failed.
@ -108,7 +116,10 @@ _dl_make_stack_executable (void **stack_endp)
else
{
if (errno != ENOMEM) /* Unexpected failure mode. */
return errno;
{
result = errno;
goto out;
}
if (size == GLRO(dl_pagesize))
/* We just tried to mprotect the lowest hole page and failed.
@ -133,6 +144,11 @@ _dl_make_stack_executable (void **stack_endp)
/* Remember that we changed the permission. */
GL(dl_stack_flags) |= PF_X;
return 0;
out:
#ifdef check_consistency
check_consistency ();
#endif
return result;
}
rtld_hidden_def (_dl_make_stack_executable)