| Index: Source/wtf/PageAllocator.cpp
|
| diff --git a/Source/wtf/PageAllocator.cpp b/Source/wtf/PageAllocator.cpp
|
| index 182a76ce2b99e1b5bf9e122ba1c2a134b9c9003d..60a02f80ad6889e369acdc53129fce8affed472c 100644
|
| --- a/Source/wtf/PageAllocator.cpp
|
| +++ b/Source/wtf/PageAllocator.cpp
|
| @@ -58,6 +58,29 @@
|
|
|
| namespace WTF {
|
|
|
| +#if OS(WIN)
|
| +
|
| +static bool shouldUseAddressHint()
|
| +{
|
| +#if CPU(32BIT)
|
| + // 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 at least 3 GB available (and likely
|
| + // 4 GB depending upon the OS version), and we want use the additional
|
| + // randomness.
|
| + static BOOL bIsWow64 = -1;
|
| + if (bIsWow64 == -1) {
|
| + IsWow64Process(GetCurrentProcess(), &bIsWow64);
|
| + }
|
| + return !!bIsWow64;
|
| +#else // CPU(32BIT)
|
| + return true;
|
| +#endif // CPU(32BIT)
|
| +}
|
| +
|
| +#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 +88,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
|
|
|