diff options
author | Morgan Brown <morganbr@users.noreply.github.com> | 2019-03-01 08:46:22 -0800 |
---|---|---|
committer | Jeremy Barton <jbarton@microsoft.com> | 2019-03-01 08:46:22 -0800 |
commit | 3c0d755886d2130e1b0db01524c140cb6c6b6fe6 (patch) | |
tree | 0d1aa730854cf37f12255a9cc0cfd4f9c60a6afa /src/vm | |
parent | 051ec3753e416cb7fab3cf36b4f3112c7a924f1e (diff) | |
download | coreclr-3c0d755886d2130e1b0db01524c140cb6c6b6fe6.tar.gz coreclr-3c0d755886d2130e1b0db01524c140cb6c6b6fe6.tar.bz2 coreclr-3c0d755886d2130e1b0db01524c140cb6c6b6fe6.zip |
Implement Serialization Guard
Add Serialization Guard API and consume it in CoreLib targets
Diffstat (limited to 'src/vm')
-rw-r--r-- | src/vm/comsynchronizable.cpp | 23 | ||||
-rw-r--r-- | src/vm/comsynchronizable.h | 1 | ||||
-rw-r--r-- | src/vm/ecalllist.h | 1 | ||||
-rw-r--r-- | src/vm/mscorlib.h | 2 | ||||
-rw-r--r-- | src/vm/threads.cpp | 33 | ||||
-rw-r--r-- | src/vm/threads.h | 6 |
6 files changed, 65 insertions, 1 deletions
diff --git a/src/vm/comsynchronizable.cpp b/src/vm/comsynchronizable.cpp index 0cd7b85d0d..a460306d3e 100644 --- a/src/vm/comsynchronizable.cpp +++ b/src/vm/comsynchronizable.cpp @@ -1423,6 +1423,29 @@ BOOL QCALLTYPE ThreadNative::YieldThread() return ret; } +FCIMPL1(Object*, ThreadNative::GetThreadDeserializationTracker, StackCrawlMark* stackMark) +{ + FCALL_CONTRACT; + OBJECTREF refRetVal = NULL; + HELPER_METHOD_FRAME_BEGIN_RET_1(refRetVal) + + // To avoid reflection trying to bypass deserialization tracking, check the caller + // and only allow SerializationInfo to call into this method. + MethodTable* pCallerMT = SystemDomain::GetCallersType(stackMark); + if (pCallerMT != MscorlibBinder::GetClass(CLASS__SERIALIZATION_INFO)) + { + COMPlusThrowArgumentException(W("stackMark"), NULL); + } + + Thread* pThread = GetThread(); + + refRetVal = ObjectFromHandle(pThread->GetOrCreateDeserializationTracker()); + + HELPER_METHOD_FRAME_END(); + + return OBJECTREFToObject(refRetVal); +} +FCIMPLEND FCIMPL0(INT32, ThreadNative::GetCurrentProcessorNumber) { diff --git a/src/vm/comsynchronizable.h b/src/vm/comsynchronizable.h index 15c0218a16..d0f3bb38ff 100644 --- a/src/vm/comsynchronizable.h +++ b/src/vm/comsynchronizable.h @@ -100,6 +100,7 @@ public: static FCDECL1(void, DisableComObjectEagerCleanup, ThreadBaseObject* pThis); #endif //FEATURE_COMINTEROP static FCDECL1(FC_BOOL_RET,IsThreadpoolThread, ThreadBaseObject* thread); + static FCDECL1(Object*, GetThreadDeserializationTracker, StackCrawlMark* stackMark); static FCDECL0(INT32, GetCurrentProcessorNumber); diff --git a/src/vm/ecalllist.h b/src/vm/ecalllist.h index 9a204e6112..35fbae2160 100644 --- a/src/vm/ecalllist.h +++ b/src/vm/ecalllist.h @@ -655,6 +655,7 @@ FCFuncStart(gThreadFuncs) FCFuncElement("Join", ThreadNative::Join) QCFuncElement("GetOptimalMaxSpinWaitsPerSpinIterationInternal", ThreadNative::GetOptimalMaxSpinWaitsPerSpinIteration) FCFuncElement("GetCurrentProcessorNumber", ThreadNative::GetCurrentProcessorNumber) + FCFuncElement("GetThreadDeserializationTracker", ThreadNative::GetThreadDeserializationTracker) FCFuncEnd() FCFuncStart(gThreadPoolFuncs) diff --git a/src/vm/mscorlib.h b/src/vm/mscorlib.h index d7b5f6e827..b78684da62 100644 --- a/src/vm/mscorlib.h +++ b/src/vm/mscorlib.h @@ -455,7 +455,7 @@ DEFINE_CLASS(IOBJECTREFERENCE, Serialization, IObjectReference) DEFINE_CLASS(IDESERIALIZATIONCB, Serialization, IDeserializationCallback) DEFINE_CLASS(STREAMING_CONTEXT, Serialization, StreamingContext) DEFINE_CLASS(SERIALIZATION_INFO, Serialization, SerializationInfo) - +DEFINE_CLASS(DESERIALIZATION_TRACKER, Serialization, DeserializationTracker) DEFINE_CLASS(IENUMERATOR, Collections, IEnumerator) diff --git a/src/vm/threads.cpp b/src/vm/threads.cpp index 7b99d2bd91..d2aab7cc89 100644 --- a/src/vm/threads.cpp +++ b/src/vm/threads.cpp @@ -1626,6 +1626,7 @@ Thread::Thread() memset(&m_activityId, 0, sizeof(m_activityId)); #endif // FEATURE_PERFTRACING m_HijackReturnKind = RT_Illegal; + m_DeserializationTracker = NULL; } //-------------------------------------------------------------------- @@ -2641,6 +2642,11 @@ Thread::~Thread() // Destroy any handles that we're using to hold onto exception objects SafeSetThrowables(NULL); + if (m_DeserializationTracker != NULL) + { + DestroyGlobalStrongHandle(m_DeserializationTracker); + } + DestroyShortWeakHandle(m_ExposedObject); DestroyStrongHandle(m_StrongHndToExposedObject); } @@ -9396,3 +9402,30 @@ ULONGLONG Thread::QueryThreadProcessorUsage() return ullCurrentUsage - ullPreviousUsage; } #endif // FEATURE_APPDOMAIN_RESOURCE_MONITORING + +OBJECTHANDLE Thread::GetOrCreateDeserializationTracker() +{ + CONTRACTL + { + THROWS; + GC_TRIGGERS; + MODE_COOPERATIVE; + } + CONTRACTL_END; + +#if !defined (DACCESS_COMPILE) + if (m_DeserializationTracker != NULL) + { + return m_DeserializationTracker; + } + + _ASSERTE(this == GetThread()); + + MethodTable* pMT = MscorlibBinder::GetClass(CLASS__DESERIALIZATION_TRACKER); + m_DeserializationTracker = CreateGlobalStrongHandle(AllocateObject(pMT)); + + _ASSERTE(m_DeserializationTracker != NULL); +#endif // !defined (DACCESS_COMPILE) + + return m_DeserializationTracker; +} diff --git a/src/vm/threads.h b/src/vm/threads.h index 2fa7569449..90a8931974 100644 --- a/src/vm/threads.h +++ b/src/vm/threads.h @@ -4970,6 +4970,12 @@ public: m_HijackReturnKind = returnKind; } #endif // FEATURE_HIJACK + +public: + OBJECTHANDLE GetOrCreateDeserializationTracker(); + +private: + OBJECTHANDLE m_DeserializationTracker; }; // End of class Thread |