Core: Add mechanisms to test for address space randomization
authorPhil Miller <mille121@illinois.edu>
Tue, 22 Sep 2009 20:11:08 +0000 (20:11 +0000)
committerPhil Miller <mille121@illinois.edu>
Tue, 22 Sep 2009 20:11:08 +0000 (20:11 +0000)
Take advantage of Linux's personality() syscall facility to see if
address space randomization was disabled before the parallel program
was launched. If it was, then Isomalloc doesn't need to act like it is
enabled.

src/conv-core/isomalloc.c
src/scripts/configure
src/scripts/configure.in
src/scripts/conv-autoconfig.h.in

index f99eec6d7875f89ab740c26f824cf1255d6b5bdd..c382b64e3cd170821c7a4b7cad2a0859b2468688 100644 (file)
@@ -47,6 +47,10 @@ added by Ryan Mokos in July 2008.
 
 static int _sync_iso = 0;
 
 
 static int _sync_iso = 0;
 
+#if CMK_HAS_ADDR_NO_RANDOMIZE
+#include <sys/personality.h>
+#endif
+
 static int read_randomflag(void)
 {
   FILE *fp;
 static int read_randomflag(void)
 {
   FILE *fp;
@@ -56,6 +60,14 @@ static int read_randomflag(void)
   if (fp != NULL) {
     fscanf(fp, "%d", &random_flag);
     fclose(fp);
   if (fp != NULL) {
     fscanf(fp, "%d", &random_flag);
     fclose(fp);
+#if CMK_HAS_ADDR_NO_RANDOMIZE
+    if(random_flag)
+    {
+       int persona = personality(0xffffffff);
+       if(persona & ADDR_NO_RANDOMIZE)
+           random_flag = 0;
+    }
+#endif
   }
   else {
     random_flag = -1;
   }
   else {
     random_flag = -1;
index a793a00c27268d9b43bbb99105c8e7d5e0f19dd6..63e3599689998658c1b8a08ae7f9a4f5c7320d58 100755 (executable)
@@ -2926,6 +2926,24 @@ _ACEOF
 
 
 
 
 
 
+#### test personality() and ADDR_NO_RANDOMIZE ####
+# Only works on modern Linux systems
+cat > $t <<EOT
+#include <sys/personality.h>
+int main() {
+    int orig_persona = personality(0xffffffff);
+    personality(orig_persona | ADDR_NO_RANDOMIZE);
+    return 0;
+}
+EOT
+test_cxx "whether personality() and ADDR_NO_RANDOMIZE exist" "yes" "no" ""
+
+cat >>confdefs.h <<_ACEOF
+#define CMK_HAS_ADDR_NO_RANDOMIZE $pass
+_ACEOF
+
+
+
 #### test if has zlib ####
 # bproc doesnot like -lz in any case
 if test -z "$CMK_BPROC"
 #### test if has zlib ####
 # bproc doesnot like -lz in any case
 if test -z "$CMK_BPROC"
index ef70d05500009c9ff6cce68c3a33d03560d735d5..4485b3d3d512f477fca396366a5842b99a3b5441 100644 (file)
@@ -1051,6 +1051,20 @@ test_cxx "whether has sleep " "yes" "no" ""
 AC_DEFINE_UNQUOTED(CMK_HAS_SLEEP, $pass, [whether has sleep])
 
 
 AC_DEFINE_UNQUOTED(CMK_HAS_SLEEP, $pass, [whether has sleep])
 
 
+#### test personality() and ADDR_NO_RANDOMIZE ####
+# Only works on modern Linux systems
+cat > $t <<EOT
+#include <sys/personality.h>
+int main() {
+    int orig_persona = personality(0xffffffff);
+    personality(orig_persona | ADDR_NO_RANDOMIZE);
+    return 0;
+}
+EOT
+test_cxx "whether personality() and ADDR_NO_RANDOMIZE exist" "yes" "no" ""
+AC_DEFINE_UNQUOTED(CMK_HAS_ADDR_NO_RANDOMIZE, $pass, [whether personality() and ADDR_NO_RANDOMIZE exist])
+
+
 #### test if has zlib ####
 # bproc doesnot like -lz in any case
 if test -z "$CMK_BPROC"
 #### test if has zlib ####
 # bproc doesnot like -lz in any case
 if test -z "$CMK_BPROC"
index 1517804df9b5e777e91011d5ffd7b6b5b43791ee..62694464cd568b33148fcba5676adde86ab34966 100644 (file)
@@ -63,6 +63,9 @@
 /* Allows gcc x86 assembly for atomic increment. */
 #undef CMK_GCC_X86_ASM_ATOMICINCREMENT
 
 /* Allows gcc x86 assembly for atomic increment. */
 #undef CMK_GCC_X86_ASM_ATOMICINCREMENT
 
+/* whether personality() and ADDR_NO_RANDOMIZE exist */
+#undef CMK_HAS_ADDR_NO_RANDOMIZE
+
 /* whether has alloca.h */
 #undef CMK_HAS_ALLOCA_H
 
 /* whether has alloca.h */
 #undef CMK_HAS_ALLOCA_H