--- glibc-2.3.3/sysdeps/unix/sysv/linux/dl-execstack.c.orig 2003-12-05 01:26:05.000000000 +0100 +++ glibc-2.3.3/sysdeps/unix/sysv/linux/dl-execstack.c 2004-03-18 16:09:49.200234840 +0100 @@ -47,11 +47,17 @@ PROT_READ|PROT_WRITE|PROT_EXEC|PROT_GROWSDOWN) == 0) goto return_success; # if __ASSUME_PROT_GROWSUPDOWN == 0 - if (errno == EINVAL) + if (errno == EINVAL) { no_growsdown = true; - else + } else { +# endif + if (errno == EACCES) /* PAX is enabled */ + return 0; + else + return errno; +# if __ASSUME_PROT_GROWSUPDOWN == 0 + } # endif - return errno; } # endif @@ -73,8 +79,11 @@ page -= size; else { - if (errno != ENOMEM) /* Unexpected failure mode. */ + if (errno == EACCES) { /* PAX is enabled */ + return 0; + } else if (errno != ENOMEM) { /* Unexpected failure mode. */ return errno; + } if (size == GL(dl_pagesize)) /* We just tried to mprotect the top hole page and failed. @@ -105,11 +114,17 @@ PROT_READ|PROT_WRITE|PROT_EXEC|PROT_GROWSUP) == 0) goto return_success; # if __ASSUME_PROT_GROWSUPDOWN == 0 - if (errno == EINVAL) + if (errno == EINVAL) { no_growsup = true; - else + } else { +# endif + if (errno == EACCES) /* PAX is enabled */ + return 0; + else + return errno; +# if __ASSUME_PROT_GROWSUPDOWN == 0 + } # endif - return errno; } # endif @@ -130,8 +145,11 @@ page += size; else { - if (errno != ENOMEM) /* Unexpected failure mode. */ + if (errno == EACCES) { /* PAX is enabled */ + return 0; + } else if (errno != ENOMEM) { /* Unexpected failure mode. */ return errno; + } if (size == GL(dl_pagesize)) /* We just tried to mprotect the lowest hole page and failed.