summaryrefslogtreecommitdiff
path: root/src/vm/amd64
diff options
context:
space:
mode:
authorJonghyun Park <parjong@gmail.com>2017-07-31 16:48:16 +0900
committerJan Kotas <jkotas@microsoft.com>2017-07-31 09:48:16 +0200
commit1c540c594cc55d8446086dcd979c48efa84e00a9 (patch)
tree51c47945f71336974265801adcd7d3bd5dd90080 /src/vm/amd64
parent8c7d6b3d2b6955d05e7289a09755a25d252273b1 (diff)
downloadcoreclr-1c540c594cc55d8446086dcd979c48efa84e00a9.tar.gz
coreclr-1c540c594cc55d8446086dcd979c48efa84e00a9.tar.bz2
coreclr-1c540c594cc55d8446086dcd979c48efa84e00a9.zip
Fill freed loader heap chunk with non-zero value (#12731)
* Add FEATURE_LOADER_HEAP_GUARD feature * Invoke memset only for reclaimed regions * Enable FEATURE_LOADER_HEAP_GUARD by default * Insert trap inside UMEntryThunk::Terminate * Make all exectuable heaps not to zero-initialize itself Use fZeroInit (instead of fMakeRelazed) * Add comment * Revert unnecessary changes * Add and use 'Poison' method to insert a trap * Do NOT invoke FlushInstructionCache * Update comment * Add comment on ARM Poisoning instruction * Use X86_INSTR_INT3 instead of 0xCC
Diffstat (limited to 'src/vm/amd64')
-rw-r--r--src/vm/amd64/cgenamd64.cpp13
-rw-r--r--src/vm/amd64/cgencpu.h1
2 files changed, 14 insertions, 0 deletions
diff --git a/src/vm/amd64/cgenamd64.cpp b/src/vm/amd64/cgenamd64.cpp
index 497abcd502..20dca22e36 100644
--- a/src/vm/amd64/cgenamd64.cpp
+++ b/src/vm/amd64/cgenamd64.cpp
@@ -670,6 +670,19 @@ void UMEntryThunkCode::Encode(BYTE* pTargetCode, void* pvSecretParam)
_ASSERTE(DbgIsExecutable(&m_movR10[0], &m_jmpRAX[3]-&m_movR10[0]));
}
+void UMEntryThunkCode::Poison()
+{
+ CONTRACTL
+ {
+ NOTHROW;
+ GC_NOTRIGGER;
+ MODE_ANY;
+ }
+ CONTRACTL_END;
+
+ m_movR10[0] = X86_INSTR_INT3;
+}
+
UMEntryThunk* UMEntryThunk::Decode(LPVOID pCallback)
{
LIMITED_METHOD_CONTRACT;
diff --git a/src/vm/amd64/cgencpu.h b/src/vm/amd64/cgencpu.h
index 64a6501dc0..b74e3ca7d3 100644
--- a/src/vm/amd64/cgencpu.h
+++ b/src/vm/amd64/cgencpu.h
@@ -472,6 +472,7 @@ struct DECLSPEC_ALIGN(8) UMEntryThunkCode
BYTE m_padding2[5];
void Encode(BYTE* pTargetCode, void* pvSecretParam);
+ void Poison();
LPCBYTE GetEntryPoint() const
{