--- ./configure.in.orig 2012-03-28 09:56:09.658231276 -0600 +++ ./configure.in 2012-03-28 09:57:37.877068843 -0600 @@ -1184,9 +1184,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 @@ -1199,12 +1201,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) @@ -1213,12 +1214,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) @@ -1260,6 +1260,7 @@ AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include #include +#include "h/unrandomize.h" void gprof_cleanup() {} int @@ -1268,9 +1269,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"); --- ./configure.orig 2012-03-28 09:56:09.667230545 -0600 +++ ./configure 2012-03-28 09:57:37.885068193 -0600 @@ -7062,9 +7062,11 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 if ac_fn_c_try_run "$LINENO"; then : @@ -7096,12 +7098,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;} @@ -7125,12 +7126,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;} @@ -7217,6 +7217,7 @@ #include #include +#include "h/unrandomize.h" void gprof_cleanup() {} int @@ -7225,9 +7226,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"); --- ./o/main.c.orig 2010-11-02 15:56:45.000000000 -0600 +++ ./o/main.c 2012-01-09 20:51:43.000000000 -0700 @@ -51,6 +51,7 @@ #include #endif #include "page.h" +#include "unrandomize.h" bool saving_system ; @@ -146,11 +147,7 @@ #endif *argv=kcl_self; -#ifdef CAN_UNRANDOMIZE_SBRK -#include -#include -#include "unrandomize.h" -#endif + UNRANDOMIZE_SBRK; #ifdef LD_BIND_NOW #include --- ./h/unrandomize.h.orig 2010-01-12 07:19:15.000000000 -0700 +++ ./h/unrandomize.h 2012-01-09 20:51:43.000000000 -0700 @@ -1,39 +1,45 @@ +#include +#include #include #include #include #include #include - -{ - errno=0; - - { - - long pers = personality(0xffffffffUL); - if (pers==-1) {printf("personality failure %d\n",errno);exit(-1);} - if (!(pers & ADDR_NO_RANDOMIZE) && !getenv("GCL_UNRANDOMIZE")) { - errno=0; - 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(); +#ifdef CAN_UNRANDOMIZE_SBRK +# ifdef GCL_GPROF +# define GPROF_CLEANUP gprof_cleanup() +# else +# define GPROF_CLEANUP +# endif +# define UNRANDOMIZE_SBRK do { \ + errno=0; \ + { \ + long pers = personality(0xffffffffUL); \ + if (pers==-1) {printf("personality failure %d\n",errno);exit(-1);} \ + if (!(pers & ADDR_NO_RANDOMIZE) && !getenv("GCL_UNRANDOMIZE")) { \ + errno=0; \ + 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; \ + errno=0; \ + execve(*argv,argv,n); \ + printf("execve failure %d\n",errno); \ + exit(-1); \ + } else { \ + printf("personality change failure %d\n",errno); \ + exit(-1); \ + } \ + } \ + } \ + } while (0) +#else +# define UNRANDOMIZE_SBRK #endif - errno=0; - execve(*argv,argv,n); - printf("execve failure %d\n",errno); - exit(-1); - } else { - printf("personality change failure %d\n",errno); - exit(-1); - } - } - } -}