diff options
author | Aditya Mandaleeka <adityam@microsoft.com> | 2017-04-17 15:51:58 -0700 |
---|---|---|
committer | Aditya Mandaleeka <adityam@microsoft.com> | 2017-04-17 15:51:58 -0700 |
commit | 0bd13a2f510848cbc1ded26638f6c91a4caa39ff (patch) | |
tree | 068ff3c094f728fa13e43b41a9cc191aa51ebac7 /src/vm/gcheaputilities.cpp | |
parent | 80ca6807369ff9fa468099a936072a121215d3dc (diff) | |
download | coreclr-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.cpp | 31 |
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 |