summaryrefslogtreecommitdiff
path: root/src/debug
diff options
context:
space:
mode:
authorEugene <Eugene.Zemtsov@microsoft.com>2015-11-04 18:21:45 -0800
committerEugene <Eugene.Zemtsov@microsoft.com>2015-11-04 18:38:00 -0800
commit789f44c21ad73f69ad4e2df23944d47fca900a0c (patch)
tree6819aed9c4f405d81c5381b172b5fa0ce422f27e /src/debug
parent9fd8dca9c31c3cd2fffe2e5d27b8b10fddbf7bed (diff)
downloadcoreclr-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.cpp21
-rw-r--r--src/debug/ee/debugger.h1
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;