Skip to content

Commit dc8fe75

Browse files
[release/10.0-preview5] Fix implementation of IFindReferenceTargetsCallback::FoundTrackerTarget (#116018)
Co-authored-by: Jeremy Koritzinsky <[email protected]> Co-authored-by: Jeremy Koritzinsky <[email protected]>
1 parent 5d90f93 commit dc8fe75

File tree

5 files changed

+34
-19
lines changed

5 files changed

+34
-19
lines changed

src/coreclr/debug/daccess/request.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5076,7 +5076,7 @@ namespace
50765076
TADDR ClrDataAccess::GetIdentityForManagedObjectWrapper(TADDR mow)
50775077
{
50785078
PTR_ManagedObjectWrapper pMOW = dac_cast<PTR_ManagedObjectWrapper>(mow);
5079-
// Replicate the logic for ManagedObjectWrapper.As(IID_IUnknown)
5079+
// Replicate the logic for _wrapper.As(IID_IUnknown)
50805080
if ((pMOW->GetFlags() & InteropLib::Com::CreateComInterfaceFlagsEx::CallerDefinedIUnknown) == InteropLib::Com::CreateComInterfaceFlagsEx::None)
50815081
{
50825082
// We have the standard IUnknown implementation, so grab it from its known location.
@@ -5173,7 +5173,7 @@ HRESULT ClrDataAccess::GetObjectComWrappersData(CLRDATA_ADDRESS objAddr, CLRDATA
51735173
for (unsigned int i = 0; i < count; i++)
51745174
{
51755175
MOWHOLDERREF pMOWRef = (MOWHOLDERREF)pListItems->GetAt(i);
5176-
PTR_ManagedObjectWrapper pMOW = PTR_ManagedObjectWrapper(dac_cast<TADDR>(pMOWRef->ManagedObjectWrapper));
5176+
PTR_ManagedObjectWrapper pMOW = PTR_ManagedObjectWrapper(dac_cast<TADDR>(pMOWRef->_wrapper));
51775177

51785178
// Now that we have the managed object wrapper, we need to figure out the COM identity of it.
51795179
TADDR pComIdentity = GetIdentityForManagedObjectWrapper(dac_cast<TADDR>(pMOW));

src/coreclr/nativeaot/System.Private.CoreLib/src/System/Runtime/InteropServices/TrackerObjectManager.NativeAot.cs

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -164,13 +164,13 @@ internal static unsafe void WalkExternalTrackerObjects()
164164
nativeObjectWrapper.TrackerObject != IntPtr.Zero)
165165
{
166166
FindReferenceTargetsCallback.s_currentRootObjectHandle = nativeObjectWrapper.ProxyHandle;
167-
if (IReferenceTracker.FindTrackerTargets(nativeObjectWrapper.TrackerObject, (IntPtr)Unsafe.AsPointer(in s_findReferencesTargetCallback)) != HResults.S_OK)
167+
int hr = IReferenceTracker.FindTrackerTargets(nativeObjectWrapper.TrackerObject, (IntPtr)Unsafe.AsPointer(in s_findReferencesTargetCallback));
168+
FindReferenceTargetsCallback.s_currentRootObjectHandle = default;
169+
if (hr < 0)
168170
{
169171
walkFailed = true;
170-
FindReferenceTargetsCallback.s_currentRootObjectHandle = default;
171172
break;
172173
}
173-
FindReferenceTargetsCallback.s_currentRootObjectHandle = default;
174174
}
175175
}
176176

@@ -227,16 +227,23 @@ private static unsafe int IFindReferenceTargetsCallback_FoundTrackerTarget(IntPt
227227
{
228228
if (referenceTrackerTarget == IntPtr.Zero)
229229
{
230-
return HResults.E_INVALIDARG;
230+
return HResults.E_POINTER;
231+
}
232+
233+
object sourceObject = s_currentRootObjectHandle.Target!;
234+
235+
if (!TryGetObject(referenceTrackerTarget, out object? targetObject))
236+
{
237+
return HResults.S_FALSE;
231238
}
232239

233-
if (TryGetObject(referenceTrackerTarget, out object? foundObject))
240+
if (sourceObject == targetObject)
234241
{
235-
// Notify the runtime a reference path was found.
236-
return TrackerObjectManager.AddReferencePath(s_currentRootObjectHandle.Target, foundObject) ? HResults.S_OK : HResults.S_FALSE;
242+
return HResults.S_FALSE;
237243
}
238244

239-
return HResults.S_OK;
245+
// Notify the runtime a reference path was found.
246+
return TrackerObjectManager.AddReferencePath(sourceObject, targetObject) ? HResults.S_OK : HResults.S_FALSE;
240247
}
241248

242249
internal struct ReferenceTargetsVftbl

src/coreclr/vm/corelib.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -462,7 +462,8 @@ DEFINE_FIELD(COMWRAPPERS, NAITVE_OBJECT_WRAPPER_TABLE, s_nativeObjectWrapperTabl
462462
DEFINE_FIELD(COMWRAPPERS, ALL_MANAGED_OBJECT_WRAPPER_TABLE, s_allManagedObjectWrapperTable)
463463

464464
DEFINE_CLASS_U(Interop, ComWrappers+ManagedObjectWrapperHolder, ManagedObjectWrapperHolderObject)
465-
DEFINE_FIELD_U(_wrapper, ManagedObjectWrapperHolderObject, ManagedObjectWrapper)
465+
DEFINE_FIELD_U(_wrappedObject, ManagedObjectWrapperHolderObject, _wrappedObject)
466+
DEFINE_FIELD_U(_wrapper, ManagedObjectWrapperHolderObject, _wrapper)
466467
DEFINE_CLASS_U(Interop, ComWrappers+NativeObjectWrapper, NativeObjectWrapperObject)
467468
DEFINE_FIELD_U(_comWrappers, NativeObjectWrapperObject, _comWrappers)
468469
DEFINE_FIELD_U(_externalComObject, NativeObjectWrapperObject, _externalComObject)

src/coreclr/vm/interoplibinterface_comwrappers.cpp

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -453,16 +453,23 @@ namespace InteropLibImports
453453
CONTRACTL_END;
454454

455455
// Get the external object's managed wrapper
456-
::OBJECTHANDLE srcHandle = static_cast<::OBJECTHANDLE>(targetHandle);
456+
::OBJECTHANDLE srcHandle = static_cast<::OBJECTHANDLE>(sourceHandle);
457457
OBJECTREF source = ObjectFromHandle(srcHandle);
458458

459459
// Get the target of the external object's reference.
460460
::OBJECTHANDLE tgtHandle = static_cast<::OBJECTHANDLE>(targetHandle);
461-
OBJECTREF target = ObjectFromHandle(tgtHandle );
461+
MOWHOLDERREF holder = (MOWHOLDERREF)ObjectFromHandle(tgtHandle);
462462

463-
// Return if the target has been collected or these are the same object.
464-
if (target == NULL
465-
|| source->PassiveGetSyncBlock() == target->PassiveGetSyncBlock())
463+
// Return if the holder has been collected
464+
if (holder == NULL)
465+
{
466+
return S_FALSE;
467+
}
468+
469+
OBJECTREF target = holder->_wrappedObject;
470+
471+
// Return if these are the same object.
472+
if (source == target)
466473
{
467474
return S_FALSE;
468475
}
@@ -496,7 +503,7 @@ bool ComWrappersNative::IsManagedObjectComWrapper(_In_ OBJECTREF managedObjectWr
496503

497504
MOWHOLDERREF holder = (MOWHOLDERREF)managedObjectWrapperHolderRef;
498505

499-
*pIsRooted = InteropLib::Com::IsRooted(holder->ManagedObjectWrapper);
506+
*pIsRooted = InteropLib::Com::IsRooted(holder->_wrapper);
500507

501508
return true;
502509
}

src/coreclr/vm/interoplibinterface_comwrappers.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,9 @@ class ManagedObjectWrapperHolderObject : public Object
7373
friend class ClrDataAccess;
7474
private:
7575
OBJECTREF _releaser;
76-
OBJECTREF _wrappedObject;
7776
public:
78-
DPTR(InteropLib::ABI::ManagedObjectWrapperLayout) ManagedObjectWrapper;
77+
OBJECTREF _wrappedObject;
78+
DPTR(InteropLib::ABI::ManagedObjectWrapperLayout) _wrapper;
7979
};
8080

8181
class NativeObjectWrapperObject : public Object

0 commit comments

Comments
 (0)