summaryrefslogtreecommitdiff
path: root/src/vm
diff options
context:
space:
mode:
authorMorgan Brown <morganbr@users.noreply.github.com>2019-03-01 08:46:22 -0800
committerJeremy Barton <jbarton@microsoft.com>2019-03-01 08:46:22 -0800
commit3c0d755886d2130e1b0db01524c140cb6c6b6fe6 (patch)
tree0d1aa730854cf37f12255a9cc0cfd4f9c60a6afa /src/vm
parent051ec3753e416cb7fab3cf36b4f3112c7a924f1e (diff)
downloadcoreclr-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.cpp23
-rw-r--r--src/vm/comsynchronizable.h1
-rw-r--r--src/vm/ecalllist.h1
-rw-r--r--src/vm/mscorlib.h2
-rw-r--r--src/vm/threads.cpp33
-rw-r--r--src/vm/threads.h6
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