From 5cb48b84921ed301dc1cc6f6e35b8ce8ed72a430 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Thu, 27 Nov 2003 05:24:58 +0000 Subject: [PATCH] Update. 2003-11-26 Ulrich Drepper * sysdeps/unix/sysv/linux/kernel-features.h (__ASSUME_PROT_GROWSUPDOWN): Define for 2.6.1 and up. * sysdeps/unix/sysv/linux/dl-execstack.c: Omit compatibility code if __ASSUME_PROT_GROWSUPDOWN is defined. 2003-11-26 Andreas Jaeger * sysdeps/unix/sysv/linux/dl-execstack.c (_dl_make_stack_executable): Set dl_stack_flags always for success. --- ChangeLog | 13 ++++++++++++ nptl/pthread_attr_destroy.c | 9 ++++++++- nptl/pthread_attr_init.c | 4 ++++ nptl/sysdeps/unix/sysv/linux/internaltypes.h | 1 + sysdeps/unix/sysv/linux/dl-execstack.c | 30 ++++++++++++++++++++++------ sysdeps/unix/sysv/linux/kernel-features.h | 8 +++++++- 6 files changed, 57 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4683049..fb91a7c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2003-11-26 Ulrich Drepper + + * sysdeps/unix/sysv/linux/kernel-features.h + (__ASSUME_PROT_GROWSUPDOWN): Define for 2.6.1 and up. + * sysdeps/unix/sysv/linux/dl-execstack.c: Omit compatibility code + if __ASSUME_PROT_GROWSUPDOWN is defined. + +2003-11-26 Andreas Jaeger + + * sysdeps/unix/sysv/linux/dl-execstack.c + (_dl_make_stack_executable): Set dl_stack_flags always for + success. + 2003-06-22 Petter Reinholdtsen * locale/program/ld-monetary.c: Only check the first three diff --git a/nptl/pthread_attr_destroy.c b/nptl/pthread_attr_destroy.c index a04f5fe..73cba1d 100644 --- a/nptl/pthread_attr_destroy.c +++ b/nptl/pthread_attr_destroy.c @@ -22,7 +22,7 @@ #include #include #include "pthreadP.h" - +#include int __pthread_attr_destroy (attr) @@ -33,6 +33,13 @@ __pthread_attr_destroy (attr) assert (sizeof (*attr) >= sizeof (struct pthread_attr)); iattr = (struct pthread_attr *) attr; +#if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_1) + /* In old struct pthread_attr, neither next nor cpuset are + present. */ + if (__builtin_expect ((iattr->flags & ATTR_FLAG_OLDATTR), 0)) + return 0; +#endif + /* Enqueue the attributes to the list of all known variables. */ if (DEBUGGING_P) { diff --git a/nptl/pthread_attr_init.c b/nptl/pthread_attr_init.c index b202d46..b1242d3 100644 --- a/nptl/pthread_attr_init.c +++ b/nptl/pthread_attr_init.c @@ -80,12 +80,16 @@ __pthread_attr_init_2_0 (attr) int inheritsched; int scope; }; + struct pthread_attr *iattr; /* Many elements are initialized to zero so let us do it all at once. This also takes care of clearing the bytes which are not internally used. */ memset (attr, '\0', sizeof (struct old_attr)); + iattr = (struct pthread_attr *) attr; + iattr->flags |= ATTR_FLAG_OLDATTR; + /* We cannot enqueue the attribute because that member is not in the old attribute structure. */ return 0; diff --git a/nptl/sysdeps/unix/sysv/linux/internaltypes.h b/nptl/sysdeps/unix/sysv/linux/internaltypes.h index e2f7b04..39afb32 100644 --- a/nptl/sysdeps/unix/sysv/linux/internaltypes.h +++ b/nptl/sysdeps/unix/sysv/linux/internaltypes.h @@ -47,6 +47,7 @@ struct pthread_attr #define ATTR_FLAG_NOTINHERITSCHED 0x0002 #define ATTR_FLAG_SCOPEPROCESS 0x0004 #define ATTR_FLAG_STACKADDR 0x0008 +#define ATTR_FLAG_OLDATTR 0x0010 /* Mutex attribute data structure. */ diff --git a/sysdeps/unix/sysv/linux/dl-execstack.c b/sysdeps/unix/sysv/linux/dl-execstack.c index 7ea3a71..aafa2df 100644 --- a/sysdeps/unix/sysv/linux/dl-execstack.c +++ b/sysdeps/unix/sysv/linux/dl-execstack.c @@ -23,6 +23,9 @@ #include #include +#include "kernel-features.h" + + extern void *__libc_stack_end; int @@ -35,15 +38,20 @@ _dl_make_stack_executable (void) /* Newer Linux kernels support a flag to make our job easy. */ # ifdef PROT_GROWSDOWN +# if __ASSUME_PROT_GROWSUPDOWN == 0 static bool no_growsdown; if (! no_growsdown) +# endif { if (__mprotect ((void *) page, GL(dl_pagesize), PROT_READ|PROT_WRITE|PROT_EXEC|PROT_GROWSDOWN) == 0) - return 0; - if (errno != EINVAL) + goto return_success; +# if __ASSUME_PROT_GROWSUPDOWN == 0 + if (errno == EINVAL) + no_growsdown = true; + else +# endif return errno; - no_growsdown = true; } # endif @@ -54,6 +62,7 @@ _dl_make_stack_executable (void) We start with a random guess at how deep the stack might have gotten so as to have extended the GROWSDOWN mapping to lower pages. */ +# if __ASSUME_PROT_GROWSUPDOWN == 0 size_t size = GL(dl_pagesize) * 8; page = page + GL(dl_pagesize) - size; while (1) @@ -78,6 +87,7 @@ _dl_make_stack_executable (void) page += size; } } +# endif #elif _STACK_GROWS_UP @@ -86,15 +96,20 @@ _dl_make_stack_executable (void) /* Newer Linux kernels support a flag to make our job easy. */ # ifdef PROT_GROWSUP +# if __ASSUME_PROT_GROWSUPDOWN == 0 static bool no_growsup; if (! no_growsup) +# endif { if (__mprotect ((void *) page, GL(dl_pagesize), PROT_READ|PROT_WRITE|PROT_EXEC|PROT_GROWSUP) == 0) - return 0; - if (errno != EINVAL) + goto return_success; +# if __ASSUME_PROT_GROWSUPDOWN == 0 + if (errno == EINVAL) + no_growsup = true; + else +# endif return errno; - no_growsup = true; } # endif @@ -105,6 +120,7 @@ _dl_make_stack_executable (void) We start with a random guess at how deep the stack might have gotten so as to have extended the GROWSUP mapping to higher pages. */ +# if __ASSUME_PROT_GROWSUPDOWN == 0 size_t size = GL(dl_pagesize) * 8; while (1) { @@ -127,11 +143,13 @@ _dl_make_stack_executable (void) size /= 2; } } +# endif #else # error "Define either _STACK_GROWS_DOWN or _STACK_GROWS_UP" #endif + return_success: /* Remember that we changed the permission. */ GL(dl_stack_flags) |= PF_X; diff --git a/sysdeps/unix/sysv/linux/kernel-features.h b/sysdeps/unix/sysv/linux/kernel-features.h index 2ce0c5e..2bc68cb 100644 --- a/sysdeps/unix/sysv/linux/kernel-features.h +++ b/sysdeps/unix/sysv/linux/kernel-features.h @@ -376,6 +376,12 @@ /* The fixed version of the posix_fadvise64 syscall appeared in 2.6.0-test3. At least for x86. */ -#if __LINUX_KERNEL_VERSION >= 132609 && (defined __i386__) +#if __LINUX_KERNEL_VERSION >= 132609 && defined __i386__ # define __ASSUME_FADVISE64_64_SYSCALL 1 #endif + +/* The PROT_GROWSDOWN/PROT_GROWSUP flags were introduced in the 2.6.0-test + series. */ +#if __LINUX_KERNEL_VERSION >= 132609 +# define __ASSUME_PROT_GROWSUPDOWN 1 +#endif -- 2.7.4