diff options
author | Eugene <Eugene.Zemtsov@microsoft.com> | 2015-11-04 18:21:45 -0800 |
---|---|---|
committer | Eugene <Eugene.Zemtsov@microsoft.com> | 2015-11-04 18:38:00 -0800 |
commit | 789f44c21ad73f69ad4e2df23944d47fca900a0c (patch) | |
tree | 6819aed9c4f405d81c5381b172b5fa0ce422f27e /src/debug | |
parent | 9fd8dca9c31c3cd2fffe2e5d27b8b10fddbf7bed (diff) | |
download | coreclr-789f44c21ad73f69ad4e2df23944d47fca900a0c.tar.gz coreclr-789f44c21ad73f69ad4e2df23944d47fca900a0c.tar.bz2 coreclr-789f44c21ad73f69ad4e2df23944d47fca900a0c.zip |
Restrict allocation of executable memory by DebuggerHeap
DebuggerHeap is a common class that is used for both executable and
non-executable memory allocations by debugging infrustructure.
On Windows, OS supports concept of executable heap and CLR doesn't need
to do anything extra for each executable allocation. On Linux/OSX
this is not true. That's why this changes preserves fExecutable flag for each heap
and makes sure that we mark memory as executable only when it is necessary.
Diffstat (limited to 'src/debug')
-rw-r--r-- | src/debug/ee/debugger.cpp | 21 | ||||
-rw-r--r-- | src/debug/ee/debugger.h | 1 |
2 files changed, 14 insertions, 8 deletions
diff --git a/src/debug/ee/debugger.cpp b/src/debug/ee/debugger.cpp index 26ae1b58fc..2662118781 100644 --- a/src/debug/ee/debugger.cpp +++ b/src/debug/ee/debugger.cpp @@ -16566,6 +16566,7 @@ DebuggerHeap::DebuggerHeap() #ifdef USE_INTEROPSAFE_HEAP m_hHeap = NULL; #endif + m_fExecutable = FALSE; } @@ -16615,6 +16616,7 @@ HRESULT DebuggerHeap::Init(BOOL fExecutable) // Have knob catch if we don't want to lazy init the debugger. _ASSERTE(!g_DbgShouldntUseDebugger); + m_fExecutable = fExecutable; #ifdef USE_INTEROPSAFE_HEAP // If already inited, then we're done. @@ -16742,14 +16744,17 @@ void *DebuggerHeap::Alloc(DWORD size) #endif #ifdef FEATURE_PAL - // We don't have executable heap in PAL, but we still need to allocate - // executable memory, that's why have change protection level for - // each allocation. - // UNIXTODO: We need to look how JIT solves this problem. - DWORD unusedFlags; - if (!VirtualProtect(ret, size, PAGE_EXECUTE_READWRITE, &unusedFlags)) - { - _ASSERTE(!"VirtualProtect failed to make this memory executable"); + if (m_fExecutable) + { + // We don't have executable heap in PAL, but we still need to allocate + // executable memory, that's why have change protection level for + // each allocation. + // UNIXTODO: We need to look how JIT solves this problem. + DWORD unusedFlags; + if (!VirtualProtect(ret, size, PAGE_EXECUTE_READWRITE, &unusedFlags)) + { + _ASSERTE(!"VirtualProtect failed to make this memory executable"); + } } #endif // FEATURE_PAL diff --git a/src/debug/ee/debugger.h b/src/debug/ee/debugger.h index 2a1ca0cf10..9d25140cc0 100644 --- a/src/debug/ee/debugger.h +++ b/src/debug/ee/debugger.h @@ -1103,6 +1103,7 @@ protected: #ifdef USE_INTEROPSAFE_HEAP HANDLE m_hHeap; #endif + BOOL m_fExecutable; }; class DebuggerJitInfo; |