diff options
-rw-r--r-- | ChangeLog | 13 | ||||
-rw-r--r-- | nptl/pthread_attr_destroy.c | 9 | ||||
-rw-r--r-- | nptl/pthread_attr_init.c | 4 | ||||
-rw-r--r-- | nptl/sysdeps/unix/sysv/linux/internaltypes.h | 1 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/dl-execstack.c | 30 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/kernel-features.h | 8 |
6 files changed, 57 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog index 46830498e9..fb91a7c333 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2003-11-26 Ulrich Drepper <drepper@redhat.com> + + * 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 <aj@suse.de> + + * sysdeps/unix/sysv/linux/dl-execstack.c + (_dl_make_stack_executable): Set dl_stack_flags always for + success. + 2003-06-22 Petter Reinholdtsen <pere@hungry.com> * 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 a04f5fe441..73cba1da01 100644 --- a/nptl/pthread_attr_destroy.c +++ b/nptl/pthread_attr_destroy.c @@ -22,7 +22,7 @@ #include <string.h> #include <unistd.h> #include "pthreadP.h" - +#include <shlib-compat.h> 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 b202d46bd3..b1242d318f 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 e2f7b047f1..39afb32aac 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 7ea3a714ac..aafa2df1b1 100644 --- a/sysdeps/unix/sysv/linux/dl-execstack.c +++ b/sysdeps/unix/sysv/linux/dl-execstack.c @@ -23,6 +23,9 @@ #include <stdbool.h> #include <stackinfo.h> +#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 2ce0c5ef0f..2bc68cbd7f 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 |