From 4c92b673747758b0c9928780f06e97cf0435acf6 Mon Sep 17 00:00:00 2001 From: "vegorov@chromium.org" Date: Wed, 22 Feb 2012 19:47:57 +0000 Subject: [PATCH] RandomizedVirtualAlloc should check for isolate presence instead of using Isolate::Current() CpuFeatures::Probe request executable memory before any isolate is initialized and entered. TBR=erik.corry@gmail.com Review URL: https://chromiumcodereview.appspot.com/9433051 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@10798 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/platform-win32.cc | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/src/platform-win32.cc b/src/platform-win32.cc index 68c393884b..6f77b3b797 100644 --- a/src/platform-win32.cc +++ b/src/platform-win32.cc @@ -837,22 +837,29 @@ size_t OS::AllocateAlignment() { static void* GetRandomAddr() { - // The address range used to randomize RWX allocations in OS::Allocate - // Try not to map pages into the default range that windows loads DLLs - // Use a multiple of 64k to prevent committing unused memory. - // Note: This does not guarantee RWX regions will be within the - // range kAllocationRandomAddressMin to kAllocationRandomAddressMax + Isolate* isolate = Isolate::UncheckedCurrent(); + // Note that the current isolate isn't set up in a call path via + // CpuFeatures::Probe. We don't care about randomization in this case because + // the code page is immediately freed. + if (isolate != NULL) { + // The address range used to randomize RWX allocations in OS::Allocate + // Try not to map pages into the default range that windows loads DLLs + // Use a multiple of 64k to prevent committing unused memory. + // Note: This does not guarantee RWX regions will be within the + // range kAllocationRandomAddressMin to kAllocationRandomAddressMax #ifdef V8_HOST_ARCH_64_BIT - static const intptr_t kAllocationRandomAddressMin = 0x0000000080000000; - static const intptr_t kAllocationRandomAddressMax = 0x000003FFFFFF0000; + static const intptr_t kAllocationRandomAddressMin = 0x0000000080000000; + static const intptr_t kAllocationRandomAddressMax = 0x000003FFFFFF0000; #else - static const intptr_t kAllocationRandomAddressMin = 0x04000000; - static const intptr_t kAllocationRandomAddressMax = 0x3FFF0000; + static const intptr_t kAllocationRandomAddressMin = 0x04000000; + static const intptr_t kAllocationRandomAddressMax = 0x3FFF0000; #endif - uintptr_t address = (V8::RandomPrivate(Isolate::Current()) << kPageSizeBits) - | kAllocationRandomAddressMin; - address &= kAllocationRandomAddressMax; - return reinterpret_cast(address); + uintptr_t address = (V8::RandomPrivate(isolate) << kPageSizeBits) + | kAllocationRandomAddressMin; + address &= kAllocationRandomAddressMax; + return reinterpret_cast(address); + } + return NULL; }