Index: Source/wtf/PageAllocator.cpp |
diff --git a/Source/wtf/PageAllocator.cpp b/Source/wtf/PageAllocator.cpp |
index 182a76ce2b99e1b5bf9e122ba1c2a134b9c9003d..fcf5360241401331babc407ff351b46c372e9ef0 100644 |
--- a/Source/wtf/PageAllocator.cpp |
+++ b/Source/wtf/PageAllocator.cpp |
@@ -58,6 +58,28 @@ |
namespace WTF { |
+#if OS(WIN) |
+ |
+static bool shouldUseAddressHint() |
+{ |
+#if !CPU(X86_64) |
+ // When running 32-bit processes under 32-bit Windows, the userspace is |
+ // limited to 2 GB, and we risk fragmenting it badly if we allow further |
+ // randomization via our address hint. On the other hand, if the process |
+ // is running under WOW64, then it has 3 GB available, and we want use the |
jschuh
2014/07/21 16:43:45
nit: Actually, it usually has 4GB available. I thi
|
+ // additional randomness. |
+ static BOOL bIsWow64 = -1; |
+ if (bIsWow64 == -1) { |
+ IsWow64Process(GetCurrentProcess(), &bIsWow64); |
+ } |
+ return !!bIsWow64; |
+#else // !CPU(X86_64) |
+ return true; |
+#endif // !CPU(X86_64) |
+} |
+ |
+#endif // OS(WIN) |
+ |
// This simple internal function wraps the OS-specific page allocation call so |
// that it behaves consistently: the address is a hint and if it cannot be used, |
// the allocation will be placed elsewhere. |
@@ -65,9 +87,10 @@ static void* systemAllocPages(void* addr, size_t len) |
{ |
ASSERT(!(len & kPageAllocationGranularityOffsetMask)); |
ASSERT(!(reinterpret_cast<uintptr_t>(addr) & kPageAllocationGranularityOffsetMask)); |
- void* ret; |
+ void* ret = 0; |
#if OS(WIN) |
- ret = VirtualAlloc(addr, len, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); |
+ if (shouldUseAddressHint()) |
+ ret = VirtualAlloc(addr, len, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); |
if (!ret) |
ret = VirtualAlloc(0, len, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); |
#else |