-rwxr-xr-x | gcl/configure | 5 | ||||
-rw-r--r-- | gcl/configure.in | 5 | ||||
-rw-r--r-- | gcl/h/unrandomize.h | 39 |
diff --git a/gcl/configure b/gcl/configure index 86c05e070..ab9c0f542 100755 --- a/gcl/configure +++ b/gcl/configure @@ -7622,7 +7622,6 @@ else #include <stdio.h> #include <stdlib.h> - int *cs_org=0; void gprof_cleanup() {}; int main(int argc,char **argv,char **envp) { #include "h/unrandomize.h" @@ -7657,7 +7656,6 @@ else #include <stdio.h> #include <stdlib.h> - int *cs_org=0; void gprof_cleanup() {}; int main(int argc,char **argv,char **envp) { FILE *f; @@ -7691,7 +7689,6 @@ else #include <stdio.h> #include <stdlib.h> - int *cs_org=0; void gprof_cleanup() {}; int main(int argc,char **argv,char **envp) { FILE *f; @@ -8033,7 +8030,6 @@ else #include <stdlib.h> #include <unistd.h> #include <stdlib.h> - int *cs_org=0; void gprof_cleanup() {}; int main(int argc,char **argv,char **envp) { @@ -8194,7 +8190,6 @@ else } void gprof_cleanup() {}; - int *cs_org; int main(int argc,char **argv,char **envp) { void *v ; FILE *fp = fopen("conftest1","w"); diff --git a/gcl/configure.in b/gcl/configure.in index 5d1ca8d7c..296fe356e 100644 --- a/gcl/configure.in +++ b/gcl/configure.in @@ -1383,7 +1383,6 @@ if test "$HAVE_SBRK" = "1" ; then AC_LANG_SOURCE([[ #include <stdio.h> #include <stdlib.h> - int *cs_org=0; void gprof_cleanup() {}; int main(int argc,char **argv,char **envp) { #include "h/unrandomize.h" @@ -1397,7 +1396,6 @@ if test "$HAVE_SBRK" = "1" ; then AC_LANG_SOURCE([[ #include <stdio.h> #include <stdlib.h> - int *cs_org=0; void gprof_cleanup() {}; int main(int argc,char **argv,char **envp) { FILE *f; @@ -1415,7 +1413,6 @@ if test "$HAVE_SBRK" = "1" ; then AC_LANG_SOURCE([[ #include <stdio.h> #include <stdlib.h> - int *cs_org=0; void gprof_cleanup() {}; int main(int argc,char **argv,char **envp) { FILE *f; @@ -1565,7 +1562,6 @@ AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include <stdlib.h> #include <unistd.h> #include <stdlib.h> - int *cs_org=0; void gprof_cleanup() {}; int main(int argc,char **argv,char **envp) { @@ -1649,7 +1645,6 @@ AC_RUN_IFELSE([AC_LANG_SOURCE([[ } void gprof_cleanup() {}; - int *cs_org; int main(int argc,char **argv,char **envp) { void *v ; FILE *fp = fopen("conftest1","w"); diff --git a/gcl/h/unrandomize.h b/gcl/h/unrandomize.h index 6618d6e1c..0cb6020e3 100644 --- a/gcl/h/unrandomize.h +++ b/gcl/h/unrandomize.h @@ -5,7 +5,6 @@ #include <alloca.h> #include <errno.h> - { errno=0; @@ -20,20 +19,38 @@ if ((pers & flag)!=flag && !getenv("GCL_UNRANDOMIZE")) { errno=0; if (personality(pers | flag) != -1 && (personality(0xffffffffUL) & flag)==flag) { - int i; + int i,j,k; char **n,**a; - extern int *cs_org; - cs_org=(void *)&flag;/*get right stack for potential gc in malloc*/ - for (i=0;envp[i];i++); - n=malloc((i+2)*sizeof(*n)); - n[i+1]=0; - n[i--]="GCL_UNRANDOMIZE=t"; - for (;i>=0;i--) - n[i]=strdup(envp[i]); + void *v; + for (i=j=0;argv[i];i++) + j+=strlen(argv[i])+1; + for (k=0;envp[k];k++) + j+=strlen(envp[k])+1; + j+=(i+k+3)*sizeof(char *); + if ((v=sbrk(j))==(void *)-1) { + printf("Cannot brk environment space\n"); + exit(-1); + } + a=v; + v=a+i+1; + n=v; + v=n+k+2; + for (i=0;argv[i];i++) { + a[i]=v; + strcpy(v,argv[i]); + v+=strlen(v)+1; + } + a[i]=0; + for (k=0;envp[k];k++) { + n[k]=v; + strcpy(v,envp[k]); + v+=strlen(v)+1; + } + n[k]="GCL_UNRANDOMIZE=t"; + n[k+1]=0; #ifdef GCL_GPROF gprof_cleanup(); #endif - for (i=0;argv[i];i++);a=malloc((i+1)*sizeof(*argv));for (i=0;argv[i];i++) a[i]=strdup(argv[i]);a[i]=0; errno=0; execve(*a,a,n); printf("execve failure %d\n",errno); |