diff -dur gcl-2.6.8.ORIG/configure gcl-2.6.8/configure --- gcl-2.6.8.ORIG/configure 2008-12-29 16:24:30.000000000 -0700 +++ gcl-2.6.8/configure 2008-12-29 16:45:51.000000000 -0700 @@ -9880,9 +9880,11 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ + #define CAN_UNRANDOMIZE_SBRK 1 + #include "h/unrandomize.h" void gprof_cleanup() {} int main(int argc,char *argv[],char *envp[]) { - #include "h/unrandomize.h" + UNRANDOMIZE_SBRK; return 0;} _ACEOF rm -f conftest$ac_exeext @@ -9947,12 +9949,11 @@ /* end confdefs.h. */ #include + #include "h/unrandomize.h" void gprof_cleanup() {} int main(int argc,char * argv[],char * envp[]) { FILE *f; - #ifdef CAN_UNRANDOMIZE_SBRK - #include "h/unrandomize.h" - #endif + UNRANDOMIZE_SBRK; if (!(f=fopen("conftest1","w"))) return -1; fprintf(f,"%u",sbrk(0)); return 0;} @@ -10009,12 +10010,11 @@ /* end confdefs.h. */ #include + #include "h/unrandomize.h" void gprof_cleanup() {} int main(int argc,char * argv[],char * envp[]) { FILE *f; - #ifdef CAN_UNRANDOMIZE_SBRK - #include "h/unrandomize.h" - #endif + UNRANDOMIZE_SBRK; if (!(f=fopen("conftest1","w"))) return -1; fprintf(f,"%u",sbrk(0)); return 0;} @@ -10165,6 +10165,7 @@ #include #include +#include "h/unrandomize.h" void gprof_cleanup() {} int @@ -10173,9 +10174,7 @@ char *b,*b1; FILE *fp; -#ifdef CAN_UNRANDOMIZE_SBRK -#include "h/unrandomize.h" -#endif + UNRANDOMIZE_SBRK; b = (void *) malloc(1000); fp = fopen("conftest1","w"); diff -dur gcl-2.6.8.ORIG/configure.in gcl-2.6.8/configure.in --- gcl-2.6.8.ORIG/configure.in 2008-12-29 16:24:30.000000000 -0700 +++ gcl-2.6.8/configure.in 2008-12-29 16:37:26.000000000 -0700 @@ -1087,9 +1087,11 @@ AC_MSG_CHECKING([for personality(ADDR_NO_RANDOMIZE) support]) AC_RUN_IFELSE([AC_LANG_SOURCE([[ + #define CAN_UNRANDOMIZE_SBRK 1 + #include "h/unrandomize.h" void gprof_cleanup() {} int main(int argc,char *argv[],char *envp[]) { - #include "h/unrandomize.h" + UNRANDOMIZE_SBRK; return 0;}]])],CAN_UNRANDOMIZE_SBRK=1,CAN_UNRANDOMIZE_SBRK=0,CAN_UNRANDOMIZE_SBRK=0) if test "$CAN_UNRANDOMIZE_SBRK" != 0 ; then @@ -1102,12 +1104,11 @@ AC_MSG_CHECKING([that sbrk is (now) non-random]) AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include + #include "h/unrandomize.h" void gprof_cleanup() {} int main(int argc,char * argv[],char * envp[]) { FILE *f; - #ifdef CAN_UNRANDOMIZE_SBRK - #include "h/unrandomize.h" - #endif + UNRANDOMIZE_SBRK; if (!(f=fopen("conftest1","w"))) return -1; fprintf(f,"%u",sbrk(0)); return 0;}]])],SBRK=`cat conftest1`,SBRK=0,SBRK=0) @@ -1116,12 +1117,11 @@ fi AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include + #include "h/unrandomize.h" void gprof_cleanup() {} int main(int argc,char * argv[],char * envp[]) { FILE *f; - #ifdef CAN_UNRANDOMIZE_SBRK - #include "h/unrandomize.h" - #endif + UNRANDOMIZE_SBRK; if (!(f=fopen("conftest1","w"))) return -1; fprintf(f,"%u",sbrk(0)); return 0;}]])],SBRK1=`cat conftest1`,SBRK1=0,SBRK1=0) @@ -1163,6 +1163,7 @@ AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include #include +#include "h/unrandomize.h" void gprof_cleanup() {} int @@ -1171,9 +1172,7 @@ char *b,*b1; FILE *fp; -#ifdef CAN_UNRANDOMIZE_SBRK -#include "h/unrandomize.h" -#endif + UNRANDOMIZE_SBRK; b = (void *) malloc(1000); fp = fopen("conftest1","w"); diff -dur gcl-2.6.8.ORIG/h/unrandomize.h gcl-2.6.8/h/unrandomize.h --- gcl-2.6.8.ORIG/h/unrandomize.h 2008-08-20 19:13:58.000000000 -0600 +++ gcl-2.6.8/h/unrandomize.h 2008-12-29 16:42:15.000000000 -0700 @@ -1,25 +1,33 @@ +#include #include #include #include #include -{ +#ifdef CAN_UNRANDOMIZE_SBRK +# ifdef GCL_GPROF +# define GPROF_CLEANUP gprof_cleanup() +# else +# define GPROF_CLEANUP +# endif - long pers = personality(0xffffffffUL); - if (!(pers & ADDR_NO_RANDOMIZE) && !getenv("GCL_UNRANDOMIZE")) - if (personality(pers | ADDR_NO_RANDOMIZE) != -1 && personality(0xffffffffUL) & ADDR_NO_RANDOMIZE) { - int i; - char **n; - for (i=0;envp[i];i++); - n=alloca((i+2)*sizeof(*n)); - n[i+1]=0; - n[i--]="GCL_UNRANDOMIZE=t"; - for (;i>=0;i--) - n[i]=envp[i]; -#ifdef GCL_GPROF - gprof_cleanup(); +#define UNRANDOMIZE_SBRK do \ +{ \ + long pers = personality(0xffffffffUL); \ + if (!(pers & ADDR_NO_RANDOMIZE) && !getenv("GCL_UNRANDOMIZE")) \ + if (personality(pers | ADDR_NO_RANDOMIZE) != -1 && personality(0xffffffffUL) & ADDR_NO_RANDOMIZE) { \ + int i; \ + char **n; \ + for (i=0;envp[i];i++); \ + n=alloca((i+2)*sizeof(*n)); \ + n[i+1]=0; \ + n[i--]="GCL_UNRANDOMIZE=t"; \ + for (;i>=0;i--) \ + n[i]=envp[i]; \ + GPROF_CLEANUP; \ + execve(*argv,argv,n); \ + } \ + } while(0) +#else +# define UNRANDOMIZE_SBRK #endif - execve(*argv,argv,n); - } - -} diff -dur gcl-2.6.8.ORIG/o/main.c gcl-2.6.8/o/main.c --- gcl-2.6.8.ORIG/o/main.c 2008-07-31 13:12:59.000000000 -0600 +++ gcl-2.6.8/o/main.c 2008-12-29 16:43:14.000000000 -0700 @@ -51,6 +51,7 @@ #include #endif #include "page.h" +#include "unrandomize.h" bool saving_system ; @@ -125,9 +126,7 @@ #endif #endif -#ifdef CAN_UNRANDOMIZE_SBRK -#include "unrandomize.h" -#endif + UNRANDOMIZE_SBRK; #if defined(DARWIN) {