From 25c332c00e636403b7600e3ac7110cde8d0fab7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Mon, 15 Apr 2013 16:31:34 +0200 Subject: iOS: Don't enable PROT_WRITE and PROT_EXEC at the same time 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 --- src/3rdparty/masm/stubs/ExecutableAllocator.h | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) (limited to 'src/3rdparty/masm') diff --git a/src/3rdparty/masm/stubs/ExecutableAllocator.h b/src/3rdparty/masm/stubs/ExecutableAllocator.h index 6ebea24a15..a6911b34f0 100644 --- a/src/3rdparty/masm/stubs/ExecutableAllocator.h +++ b/src/3rdparty/masm/stubs/ExecutableAllocator.h @@ -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(addr); + size_t roundAddr = iaddr & ~(pageSize - static_cast(1)); + + int mode = PROT_READ | PROT_WRITE; + mprotect(reinterpret_cast(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(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(roundAddr), size + (iaddr - roundAddr), mode); #endif } -- cgit v1.2.3