diff options
author | Jonghyun Park <parjong@gmail.com> | 2017-07-31 16:48:16 +0900 |
---|---|---|
committer | Jan Kotas <jkotas@microsoft.com> | 2017-07-31 09:48:16 +0200 |
commit | 1c540c594cc55d8446086dcd979c48efa84e00a9 (patch) | |
tree | 51c47945f71336974265801adcd7d3bd5dd90080 /src/vm/amd64 | |
parent | 8c7d6b3d2b6955d05e7289a09755a25d252273b1 (diff) | |
download | coreclr-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.cpp | 13 | ||||
-rw-r--r-- | src/vm/amd64/cgencpu.h | 1 |
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 { |