Skip to content

Commit 2521784

Browse files
arkqpull[bot]
authored andcommitted
Fix segfault caused by accessing released device object (#16168)
* Fix segfault caused by accessing released device object Local reference to the device being commissioned has to be cleared when the device object is released. Otherwise, we will have a local pointer to freed memory. * Send operational certificate to given device Given device proxy object might not necessarily be a device currently being commissioned.
1 parent 8729f1b commit 2521784

File tree

1 file changed

+8
-7
lines changed

1 file changed

+8
-7
lines changed

src/controller/CHIPDeviceController.cpp

+8-7
Original file line numberDiff line numberDiff line change
@@ -745,6 +745,11 @@ CommissioneeDeviceProxy * DeviceCommissioner::FindCommissioneeDevice(NodeId id)
745745
void DeviceCommissioner::ReleaseCommissioneeDevice(CommissioneeDeviceProxy * device)
746746
{
747747
mCommissioneeDevicePool.ReleaseObject(device);
748+
// Make sure that there will be no dangling pointer
749+
if (mDeviceBeingCommissioned == device)
750+
{
751+
mDeviceBeingCommissioned = nullptr;
752+
}
748753
}
749754

750755
CHIP_ERROR DeviceCommissioner::GetDeviceBeingCommissioned(NodeId deviceId, CommissioneeDeviceProxy ** out_device)
@@ -887,7 +892,6 @@ CHIP_ERROR DeviceCommissioner::EstablishPASEConnection(NodeId remoteDeviceId, Re
887892
if (device != nullptr)
888893
{
889894
ReleaseCommissioneeDevice(device);
890-
mDeviceBeingCommissioned = nullptr;
891895
}
892896
}
893897

@@ -972,7 +976,6 @@ void DeviceCommissioner::RendezvousCleanup(CHIP_ERROR status)
972976
// for IP commissioning, we have taken a reference to the
973977
// operational node to send the completion command.
974978
ReleaseCommissioneeDevice(mDeviceBeingCommissioned);
975-
mDeviceBeingCommissioned = nullptr;
976979
}
977980

978981
if (mPairingDelegate != nullptr)
@@ -1243,8 +1246,8 @@ CHIP_ERROR DeviceCommissioner::SendOperationalCertificate(DeviceProxy * device,
12431246
request.caseAdminNode = adminSubject;
12441247
request.adminVendorId = mVendorId;
12451248

1246-
ReturnErrorOnFailure(SendCommand<OperationalCredentialsCluster>(mDeviceBeingCommissioned, request,
1247-
OnOperationalCertificateAddResponse, OnAddNOCFailureResponse));
1249+
ReturnErrorOnFailure(
1250+
SendCommand<OperationalCredentialsCluster>(device, request, OnOperationalCertificateAddResponse, OnAddNOCFailureResponse));
12481251

12491252
ChipLogProgress(Controller, "Sent operational certificate to the device");
12501253

@@ -1466,7 +1469,7 @@ void DeviceCommissioner::CommissioningStageComplete(CHIP_ERROR err, Commissionin
14661469
{
14671470
// Commissioning delegate will only return error if it failed to perform the appropriate commissioning step.
14681471
// In this case, we should call back the commissioning complete and call session error
1469-
if (mPairingDelegate != nullptr)
1472+
if (mPairingDelegate != nullptr && mDeviceBeingCommissioned != nullptr)
14701473
{
14711474
mPairingDelegate->OnCommissioningComplete(mDeviceBeingCommissioned->GetDeviceId(), status);
14721475
}
@@ -1487,7 +1490,6 @@ void DeviceCommissioner::OnDeviceConnectedFn(void * context, OperationalDevicePr
14871490
// Let's release the device that's being paired, if pairing was successful,
14881491
// and the device is available on the operational network.
14891492
commissioner->ReleaseCommissioneeDevice(commissioner->mDeviceBeingCommissioned);
1490-
commissioner->mDeviceBeingCommissioned = nullptr;
14911493
if (commissioner->mCommissioningDelegate != nullptr)
14921494
{
14931495
CommissioningDelegate::CommissioningReport report;
@@ -1544,7 +1546,6 @@ void DeviceCommissioner::OnDeviceConnectionFailureFn(void * context, PeerId peer
15441546
//
15451547
// Run the above cases under valgrind/asan to validate no additional leaks.
15461548
commissioner->ReleaseCommissioneeDevice(commissioner->mDeviceBeingCommissioned);
1547-
commissioner->mDeviceBeingCommissioned = nullptr;
15481549
}
15491550
}
15501551

0 commit comments

Comments
 (0)