summaryrefslogtreecommitdiff
path: root/src/vm/gcheaputilities.cpp
diff options
context:
space:
mode:
authorAditya Mandaleeka <adityam@microsoft.com>2017-04-17 15:51:58 -0700
committerAditya Mandaleeka <adityam@microsoft.com>2017-04-17 15:51:58 -0700
commit0bd13a2f510848cbc1ded26638f6c91a4caa39ff (patch)
tree068ff3c094f728fa13e43b41a9cc191aa51ebac7 /src/vm/gcheaputilities.cpp
parent80ca6807369ff9fa468099a936072a121215d3dc (diff)
downloadcoreclr-0bd13a2f510848cbc1ded26638f6c91a4caa39ff.tar.gz
coreclr-0bd13a2f510848cbc1ded26638f6c91a4caa39ff.tar.bz2
coreclr-0bd13a2f510848cbc1ded26638f6c91a4caa39ff.zip
Add handle assignment validation to VM side.
Diffstat (limited to 'src/vm/gcheaputilities.cpp')
-rw-r--r--src/vm/gcheaputilities.cpp31
1 files changed, 24 insertions, 7 deletions
diff --git a/src/vm/gcheaputilities.cpp b/src/vm/gcheaputilities.cpp
index 4bce7f5592..cd7afede70 100644
--- a/src/vm/gcheaputilities.cpp
+++ b/src/vm/gcheaputilities.cpp
@@ -40,17 +40,12 @@ bool g_sw_ww_enabled_for_gc_heap = false;
gc_alloc_context g_global_alloc_context = {};
// Debug-only validation for handle.
-void ValidateHandleAndAppDomain(OBJECTHANDLE handle)
+
+void ValidateObjectAndAppDomain(OBJECTREF objRef, ADIndex appDomainIndex)
{
#ifdef _DEBUG_IMPL
- OBJECTREF objRef = ObjectToOBJECTREF(*(Object**)handle);
VALIDATEOBJECTREF(objRef);
- IGCHandleManager *pHandleManager = GCHandleUtilities::GetGCHandleManager();
-
- DWORD context = (DWORD)pHandleManager->GetHandleContext(handle);
-
- ADIndex appDomainIndex = ADIndex(context);
AppDomain *domain = SystemDomain::GetAppDomainAtIndex(appDomainIndex);
// Access to a handle in an unloaded domain is not allowed
@@ -72,3 +67,25 @@ void ValidateHandleAndAppDomain(OBJECTHANDLE handle)
#endif // CHECK_APP_DOMAIN_LEAKS
#endif // _DEBUG_IMPL
}
+
+void ValidateHandleAssignment(OBJECTHANDLE handle, OBJECTREF objRef)
+{
+#ifdef _DEBUG_IMPL
+ _ASSERTE(handle);
+
+#ifdef DEBUG_DestroyedHandleValue
+ // Verify that we are not trying to access a freed handle.
+ _ASSERTE("Attempt to access destroyed handle." && *(_UNCHECKED_OBJECTREF*)handle != DEBUG_DestroyedHandleValue);
+#endif
+
+ ADIndex appDomainIndex = HndGetHandleADIndex(handle);
+
+ AppDomain *unloadingDomain = SystemDomain::AppDomainBeingUnloaded();
+ if (unloadingDomain && unloadingDomain->GetIndex() == appDomainIndex && unloadingDomain->NoAccessToHandleTable())
+ {
+ _ASSERTE (!"Access to a handle in unloaded domain is not allowed");
+ }
+
+ ValidateObjectAndAppDomain(objRef, appDomainIndex);
+#endif // _DEBUG_IMPL
+} \ No newline at end of file