iOS: Don't enable PROT_WRITE and PROT_EXEC at the same time
authorTor Arne Vestbø <tor.arne.vestbo@digia.com>
Mon, 15 Apr 2013 14:31:34 +0000 (16:31 +0200)
committerSimon Hausmann <simon.hausmann@digia.com>
Wed, 17 Apr 2013 11:47:59 +0000 (13:47 +0200)
We define ENABLE_ASSEMBLER_WX_EXCLUSIVE, which we use to limit
the page flags to either RW or RX.

Change-Id: I253648ea98610438a533c7a7ccbf5c27c3b8230a
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
src/3rdparty/masm/stubs/ExecutableAllocator.h
src/qml/qml/v4vm/v4vm.pri

index 6ebea24..a6911b3 100644 (file)
@@ -94,8 +94,18 @@ struct ExecutableAllocator {
         return adoptRef(new ExecutableMemoryHandle(realAllocator, size));
     }
 
-    static void makeWritable(void*, int)
+    static void makeWritable(void* addr, int size)
     {
+#if ENABLE(ASSEMBLER_WX_EXCLUSIVE)
+        size_t pageSize = WTF::pageSize();
+        size_t iaddr = reinterpret_cast<size_t>(addr);
+        size_t roundAddr = iaddr & ~(pageSize - static_cast<size_t>(1));
+
+        int mode = PROT_READ | PROT_WRITE;
+        mprotect(reinterpret_cast<void*>(roundAddr), size + (iaddr - roundAddr), mode);
+#else
+        // We assume we already have RWX
+#endif
     }
 
     static void makeExecutable(void* addr, int size)
@@ -107,7 +117,10 @@ struct ExecutableAllocator {
         DWORD oldProtect;
         VirtualProtect(reinterpret_cast<void*>(roundAddr), size + (iaddr - roundAddr), PAGE_EXECUTE_READWRITE, &oldProtect);
 #else
-        int mode = PROT_READ | PROT_WRITE | PROT_EXEC;
+        int mode = PROT_READ | PROT_EXEC;
+#if !ENABLE(ASSEMBLER_WX_EXCLUSIVE)
+        mode |= PROT_WRITE;
+#endif
         mprotect(reinterpret_cast<void*>(roundAddr), size + (iaddr - roundAddr), mode);
 #endif
     }
index d406b55..92f13ab 100644 (file)
@@ -154,6 +154,8 @@ valgrind {
     DEFINES += V4_USE_VALGRIND
 }
 
+ios: DEFINES += ENABLE_ASSEMBLER_WX_EXCLUSIVE=1
+
 include(moth/moth.pri)
 include(../../../3rdparty/masm/masm.pri)
 include(../../../3rdparty/double-conversion/double-conversion.pri)