Blob Blame History Raw
--- gcl-2.6.7/o/main.c.pers	2005-09-09 20:36:46.000000000 +0200
+++ gcl-2.6.7/o/main.c	2005-09-09 21:07:51.000000000 +0200
@@ -117,11 +117,9 @@
 #endif
 #endif
 
-#ifdef NEED_NONRANDOM_SBRK
 #include <syscall.h>
-#include <linux/personality.h>
+#include <sys/personality.h>
 #include <unistd.h>
-#endif
 
 int
 main(int argc, char **argv, char **envp) {
@@ -131,14 +129,25 @@
 #endif
 #endif
 
-#ifdef NEED_NONRANDOM_SBRK
-#if SIZEOF_LONG == 4
-	if (!syscall(SYS_personality,PER_LINUX32))
-#else
-        if (!syscall(SYS_personality,PER_LINUX))
-#endif
-	  execvp(argv[0],argv);
-#endif
+	long pers = personality(-1);
+	/* 0x40000 aka. ADDR_NO_RANDOMIZE */
+	if (!(pers & 0x40000)) {
+	  if (personality(pers | 0x40000) != -1) {
+	    /* Use /proc/self/exe instead of trying to figure out the
+	     * executable path from PATH and argv[0], since that's reliable.
+	     */
+	    char buf[PATH_MAX+1];
+	    int rc = readlink("/proc/self/exe", buf, PATH_MAX);
+	    if ( rc > 0 ) {
+	      buf[rc]=0;
+	      execve(buf, argv, envp);
+	    }
+	  }
+	  /* Either changing the personality or execve() failed. Either
+	   * way we might as well continue, and hope that the random
+	   * memory maps are ok this time around.
+	   */
+	}
 
 #if defined(DARWIN)
     extern void init_darwin_zone_compat ();
--- gcl-2.6.7/configure.pers	2005-09-09 20:51:26.000000000 +0200
+++ gcl-2.6.7/configure	2005-09-09 21:06:56.000000000 +0200
@@ -3887,17 +3887,18 @@
 #line 3888 "configure"
 #include "confdefs.h"
 #include <syscall.h>
-			    #include <linux/personality.h>
+			    #include <sys/personality.h>
 	         	    #include <stdio.h>
 			    #include <unistd.h>
 			    int main(int argc,char * argv[]) {
 				FILE *f;
-				#if SIZEOF_LONG == 4
-				if (!syscall(SYS_personality,PER_LINUX32))
-				#else
-				if (!syscall(SYS_personality,PER_LINUX))
-				#endif
-					execvp(argv[0],argv);
+                                long pers = personality(-1);
+                                if (!(pers & 0x40000)) {
+                                  if (personality(pers | 0x40000) != -1) {
+                                    execvp(argv[0],argv);
+                                   }
+                                }
+
 				if (!(f=fopen("conftest1","w")))
 					return -1;
 				fprintf(f,"%u",sbrk(0));
@@ -3927,17 +3928,17 @@
 #line 3928 "configure"
 #include "confdefs.h"
 #include <syscall.h>
-			    #include <linux/personality.h>
+			    #include <sys/personality.h>
 			    #include <stdio.h>
 			    #include <unistd.h>
 			    int main(int argc,char * argv[]) {
 				FILE *f;
-				#if SIZEOF_LONG == 4
-				if (!syscall(SYS_personality,PER_LINUX32))
-				#else
-				if (!syscall(SYS_personality,PER_LINUX))
-				#endif
-					execvp(argv[0],argv);
+                                long pers = personality(-1);
+                                if (!(pers & 0x40000)) {
+                                  if (personality(pers | 0x40000) != -1) {
+                                    execvp(argv[0],argv);
+                                   }
+                                }
 				if (!(f=fopen("conftest1","w")))
 					return -1;
 				fprintf(f,"%u",sbrk(0));
@@ -3989,25 +3990,22 @@
 #include "confdefs.h"
 #include <stdio.h>
             #include <stdlib.h>
-	    #ifdef NEED_NONRANDOM_SBRK
 		   #include <syscall.h>
-		   #include <linux/personality.h>
+		   #include <sys/personality.h>
 		   #include <unistd.h>
-	   #endif
 int
 main(int argc,char * argv[])
 {
   char *b;
   FILE *fp;
 
-#ifdef NEED_NONRANDOM_SBRK
-#if SIZEOF_LONG == 4
-if (!syscall(SYS_personality,PER_LINUX32))
-#else
-if (!syscall(SYS_personality,PER_LINUX))
-#endif
-     execvp(argv[0],argv);
-#endif  
+  long pers = personality(-1);
+  if (!(pers & 0x40000)) {
+    if (personality(pers | 0x40000) != -1) {
+      execvp(argv[0],argv);
+    }
+  }
+
   b = (void *) malloc(1000);
   fp = fopen("conftest1","w");