Skip to content

Commit 13709ae

Browse files
authored
Fix incorrect CCW decoding in GetObjectForCCW (#61193) (#61341)
* Fix incorrect CCW decoding in GetObjectForCCW * Fix linux/mac build
1 parent 9c60882 commit 13709ae

File tree

3 files changed

+48
-10
lines changed

3 files changed

+48
-10
lines changed

src/coreclr/debug/daccess/dacdbiimpl.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4939,13 +4939,20 @@ VMPTR_OBJECTHANDLE DacDbiInterfaceImpl::GetObjectForCCW(CORDB_ADDRESS ccwPtr)
49394939

49404940
OBJECTHANDLE ohCCW = NULL;
49414941

4942+
#ifdef FEATURE_COMWRAPPERS
4943+
if (DACTryGetComWrappersHandleFromCCW(ccwPtr, &ohCCW) != S_OK)
4944+
{
4945+
#endif
49424946
#ifdef FEATURE_COMINTEROP
49434947
ComCallWrapper *pCCW = DACGetCCWFromAddress(ccwPtr);
49444948
if (pCCW)
49454949
{
49464950
ohCCW = pCCW->GetObjectHandle();
49474951
}
49484952
#endif
4953+
#ifdef FEATURE_COMWRAPPERS
4954+
}
4955+
#endif
49494956

49504957
VMPTR_OBJECTHANDLE vmObjHandle;
49514958
vmObjHandle.SetDacTargetPtr(ohCCW);

src/coreclr/debug/daccess/dacimpl.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1498,6 +1498,11 @@ class ClrDataAccess
14981498

14991499
static LONG s_procInit;
15001500

1501+
protected:
1502+
#ifdef FEATURE_COMWRAPPERS
1503+
HRESULT DACTryGetComWrappersHandleFromCCW(CLRDATA_ADDRESS ccwPtr, OBJECTHANDLE* objHandle);
1504+
#endif
1505+
15011506
public:
15021507
// APIs for picking up the info needed for a debugger to look up an ngen image or IL image
15031508
// from it's search path.

src/coreclr/debug/daccess/request.cpp

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4176,41 +4176,67 @@ TADDR ClrDataAccess::DACGetManagedObjectWrapperFromCCW(CLRDATA_ADDRESS ccwPtr)
41764176
return managedObjectWrapperPtr;
41774177
}
41784178

4179-
HRESULT ClrDataAccess::DACTryGetComWrappersObjectFromCCW(CLRDATA_ADDRESS ccwPtr, OBJECTREF* objRef)
4179+
HRESULT ClrDataAccess::DACTryGetComWrappersHandleFromCCW(CLRDATA_ADDRESS ccwPtr, OBJECTHANDLE* objHandle)
41804180
{
4181-
if (ccwPtr == 0 || objRef == NULL)
4182-
return E_INVALIDARG;
4181+
HRESULT hr = E_FAIL;
4182+
TADDR ccw, managedObjectWrapperPtr;
4183+
ULONG32 bytesRead = 0;
4184+
OBJECTHANDLE handle;
41834185

4184-
SOSDacEnter();
4186+
if (ccwPtr == 0 || objHandle == NULL)
4187+
{
4188+
hr = E_INVALIDARG;
4189+
goto ErrExit;
4190+
}
41854191

41864192
if (!DACIsComWrappersCCW(ccwPtr))
41874193
{
41884194
hr = E_FAIL;
41894195
goto ErrExit;
41904196
}
41914197

4192-
TADDR ccw = CLRDATA_ADDRESS_TO_TADDR(ccwPtr);
4198+
ccw = CLRDATA_ADDRESS_TO_TADDR(ccwPtr);
41934199

41944200
// Return ManagedObjectWrapper as an OBJECTHANDLE. (The OBJECTHANDLE is guaranteed to live at offset 0).
4195-
TADDR managedObjectWrapperPtr = DACGetManagedObjectWrapperFromCCW(ccwPtr);
4201+
managedObjectWrapperPtr = DACGetManagedObjectWrapperFromCCW(ccwPtr);
41964202
if (managedObjectWrapperPtr == NULL)
41974203
{
41984204
hr = E_FAIL;
41994205
goto ErrExit;
42004206
}
42014207

4202-
ULONG32 bytesRead = 0;
4203-
OBJECTHANDLE handle;
42044208
IfFailGo(m_pTarget->ReadVirtual(managedObjectWrapperPtr, (PBYTE)&handle, sizeof(OBJECTHANDLE), &bytesRead));
42054209
if (bytesRead != sizeof(OBJECTHANDLE))
42064210
{
42074211
hr = E_FAIL;
42084212
goto ErrExit;
42094213
}
42104214

4211-
*objRef = ObjectFromHandle(handle);
4215+
*objHandle = handle;
42124216

4213-
SOSDacLeave();
4217+
return S_OK;
4218+
4219+
ErrExit: return hr;
4220+
}
4221+
4222+
HRESULT ClrDataAccess::DACTryGetComWrappersObjectFromCCW(CLRDATA_ADDRESS ccwPtr, OBJECTREF* objRef)
4223+
{
4224+
HRESULT hr = E_FAIL;
4225+
4226+
if (ccwPtr == 0 || objRef == NULL)
4227+
{
4228+
hr = E_INVALIDARG;
4229+
goto ErrExit;
4230+
}
4231+
4232+
OBJECTHANDLE handle;
4233+
if (DACTryGetComWrappersHandleFromCCW(ccwPtr, &handle) != S_OK)
4234+
{
4235+
hr = E_FAIL;
4236+
goto ErrExit;
4237+
}
4238+
4239+
*objRef = ObjectFromHandle(handle);
42144240

42154241
return S_OK;
42164242

0 commit comments

Comments
 (0)