summaryrefslogtreecommitdiffstats
path: root/testing/xulrunner/ff9-aslr-fix.patch
blob: 4e4297d0edd37aa9441b1ab3378abc773c1366f5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
--- ./js/src/jsgcchunk.cpp        2011-12-22 17:13:21.000000000 +0000
+++ ./js/src/jsgcchunk.cpp        2011-12-22 17:18:31.000000000 +0000
@@ -213,7 +213,7 @@
 #elif defined(XP_UNIX)
 
 /* Required on Solaris 10. Might improve performance elsewhere. */
-# if defined(SOLARIS) && defined(MAP_ALIGN)
+# if (defined(SOLARIS) && defined(MAP_ALIGN)) || defined(MOZ_MEMORY_LINUX) 
 #  define JS_GC_HAS_MAP_ALIGN
 
 static void *
--- ./js/src/jsgcchunk.cpp        2011-12-22 17:55:24.000000000 +0000
+++ ./js/src/jsgcchunk.cpp        2011-12-22 18:02:24.000000000 +0000
@@ -226,12 +226,24 @@
 #ifdef SOLARIS
     void *p = mmap((caddr_t) alignment, size, PROT_READ | PROT_WRITE,
                      MAP_PRIVATE | MAP_NOSYNC | MAP_ALIGN | MAP_ANON, -1, 0);
+    if (p == MAP_FAILED)
+        return NULL;
 #else
-    void *p = mmap((void *) alignment, size, PROT_READ | PROT_WRITE,
-                     MAP_PRIVATE | MAP_NOSYNC | MAP_ALIGN | MAP_ANON, -1, 0);
-#endif
+    void *p = mmap(NULL, size + alignment, PROT_READ | PROT_WRITE,
+                     MAP_PRIVATE | MAP_NOSYNC | MAP_ANON, -1, 0);
     if (p == MAP_FAILED)
         return NULL;
+       uintptr_t aligned_ret;
+       size_t extra_size;
+
+       aligned_ret = (uintptr_t)p + alignment - 1;
+       aligned_ret &= ~(alignment - 1);
+       extra_size = aligned_ret - (uintptr_t)p;
+       munmap(p, extra_size);
+       munmap(p + extra_size + size, alignment - extra_size);
+       p = (void *)aligned_ret;
+#endif
+
     return p;
 }