Skip to content

Commit b6859d7

Browse files
authored
No longer provide OperationDeviceProxy in OnDeviceConnected callback (#21256)
Previous implementations of OnDeviceConnected held onto OperationalDeviceProxy when they really should not have could lead to use after free should something else free that OperationalDeviceProxy.
1 parent ee04eb6 commit b6859d7

File tree

72 files changed

+653
-471
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

72 files changed

+653
-471
lines changed

Diff for: examples/all-clusters-app/all-clusters-common/src/binding-handler.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,8 @@ static void RegisterSwitchCommands()
6767
}
6868
#endif // defined(ENABLE_CHIP_SHELL)
6969

70-
static void BoundDeviceChangedHandler(const EmberBindingTableEntry & binding, chip::DeviceProxy * peer_device, void * context)
70+
static void BoundDeviceChangedHandler(const EmberBindingTableEntry & binding, chip::OperationalDeviceProxy * peer_device,
71+
void * context)
7172
{
7273
using namespace chip;
7374
using namespace chip::app;
@@ -88,6 +89,7 @@ static void BoundDeviceChangedHandler(const EmberBindingTableEntry & binding, ch
8889
ChipLogError(NotSpecified, "OnOff command failed: %" CHIP_ERROR_FORMAT, error.Format());
8990
};
9091

92+
VerifyOrDie(peer_device != nullptr && peer_device->ConnectionReady());
9193
if (sSwitchOnOffState)
9294
{
9395
Clusters::OnOff::Commands::On::Type onCommand;

Diff for: examples/all-clusters-app/ameba/main/BindingHandler.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ Engine sShellSwitchBindingSubCommands;
5050

5151
namespace {
5252

53-
void ProcessOnOffUnicastBindingCommand(CommandId commandId, const EmberBindingTableEntry & binding, DeviceProxy * peer_device)
53+
void ProcessOnOffUnicastBindingCommand(CommandId commandId, const EmberBindingTableEntry & binding,
54+
OperationalDeviceProxy * peer_device)
5455
{
5556
auto onSuccess = [](const ConcreteCommandPath & commandPath, const StatusIB & status, const auto & dataResponse) {
5657
ChipLogProgress(NotSpecified, "OnOff command succeeds");
@@ -60,6 +61,7 @@ void ProcessOnOffUnicastBindingCommand(CommandId commandId, const EmberBindingTa
6061
ChipLogError(NotSpecified, "OnOff command failed: %" CHIP_ERROR_FORMAT, error.Format());
6162
};
6263

64+
VerifyOrDie(peer_device != nullptr && peer_device->ConnectionReady());
6365
switch (commandId)
6466
{
6567
case Clusters::OnOff::Commands::Toggle::Id:
@@ -106,7 +108,7 @@ void ProcessOnOffGroupBindingCommand(CommandId commandId, const EmberBindingTabl
106108
}
107109
}
108110

109-
void LightSwitchChangedHandler(const EmberBindingTableEntry & binding, DeviceProxy * peer_device, void * context)
111+
void LightSwitchChangedHandler(const EmberBindingTableEntry & binding, OperationalDeviceProxy * peer_device, void * context)
110112
{
111113
VerifyOrReturn(context != nullptr, ChipLogError(NotSpecified, "OnDeviceConnectedFn: context is null"));
112114
BindingCommandData * data = static_cast<BindingCommandData *>(context);

Diff for: examples/all-clusters-app/esp32/main/include/ShellCommands.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ class CASECommands
134134

135135
private:
136136
CASECommands() {}
137-
static void OnConnected(void * context, OperationalDeviceProxy * deviceProxy)
137+
static void OnConnected(void * context, Messaging::ExchangeManager & exchangeMgr, SessionHandle & sessionHandle)
138138
{
139139
streamer_printf(streamer_get(), "Establish CASESession Success!\r\n");
140140
GetInstance().SetOnConnecting(false);

Diff for: examples/all-clusters-app/nxp/mw320/binding-handler.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@ static void RegisterSwitchCommands()
6868
}
6969
#endif // defined(ENABLE_CHIP_SHELL)
7070

71-
static void BoundDeviceChangedHandler(const EmberBindingTableEntry & binding, chip::DeviceProxy * peer_device, void * context)
71+
static void BoundDeviceChangedHandler(const EmberBindingTableEntry & binding, chip::OperationalDeviceProxy * peer_device,
72+
void * context)
7273
{
7374
using namespace chip;
7475
using namespace chip::app;
@@ -92,6 +93,7 @@ static void BoundDeviceChangedHandler(const EmberBindingTableEntry & binding, ch
9293
// command (SwitchCommandHandler)
9394
{
9495
Clusters::OnOff::Commands::Toggle::Type toggleCommand;
96+
VerifyOrDie(peer_device != nullptr && peer_device->ConnectionReady());
9597
Controller::InvokeCommandRequest(peer_device->GetExchangeManager(), peer_device->GetSecureSession().Value(),
9698
binding.remote, toggleCommand, onSuccess, onFailure);
9799
}

Diff for: examples/all-clusters-minimal-app/esp32/main/include/ShellCommands.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ class CASECommands
134134

135135
private:
136136
CASECommands() {}
137-
static void OnConnected(void * context, OperationalDeviceProxy * deviceProxy)
137+
static void OnConnected(void * context, Messaging::ExchangeManager & exchangeMgr, SessionHandle & sessionHandle)
138138
{
139139
streamer_printf(streamer_get(), "Establish CASESession Success!\r\n");
140140
GetInstance().SetOnConnecting(false);

Diff for: examples/chip-tool/commands/clusters/ModelCommand.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,14 @@ CHIP_ERROR ModelCommand::RunCommand()
4646
&mOnDeviceConnectionFailureCallback);
4747
}
4848

49-
void ModelCommand::OnDeviceConnectedFn(void * context, chip::OperationalDeviceProxy * device)
49+
void ModelCommand::OnDeviceConnectedFn(void * context, chip::Messaging::ExchangeManager & exchangeMgr,
50+
chip::SessionHandle & sessionHandle)
5051
{
5152
ModelCommand * command = reinterpret_cast<ModelCommand *>(context);
5253
VerifyOrReturn(command != nullptr, ChipLogError(chipTool, "OnDeviceConnectedFn: context is null"));
5354

54-
CHIP_ERROR err = command->SendCommand(device, command->mEndPointId);
55+
chip::OperationalDeviceProxy device(&exchangeMgr, sessionHandle);
56+
CHIP_ERROR err = command->SendCommand(&device, command->mEndPointId);
5557
VerifyOrReturn(CHIP_NO_ERROR == err, command->SetCommandExitStatus(err));
5658
}
5759

Diff for: examples/chip-tool/commands/clusters/ModelCommand.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,8 @@ class ModelCommand : public CHIPCommand
6969
chip::NodeId mDestinationId;
7070
std::vector<chip::EndpointId> mEndPointId;
7171

72-
static void OnDeviceConnectedFn(void * context, chip::OperationalDeviceProxy * device);
72+
static void OnDeviceConnectedFn(void * context, chip::Messaging::ExchangeManager & exchangeMgr,
73+
chip::SessionHandle & sessionHandle);
7374
static void OnDeviceConnectionFailureFn(void * context, const chip::ScopedNodeId & peerId, CHIP_ERROR error);
7475

7576
chip::Callback::Callback<chip::OnDeviceConnected> mOnDeviceConnectedCallback;

Diff for: examples/chip-tool/commands/pairing/CloseSessionCommand.cpp

+7-7
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,16 @@ CHIP_ERROR CloseSessionCommand::RunCommand()
2828
CommissioneeDeviceProxy * commissioneeDeviceProxy = nullptr;
2929
if (CHIP_NO_ERROR == CurrentCommissioner().GetDeviceBeingCommissioned(mDestinationId, &commissioneeDeviceProxy))
3030
{
31-
return CloseSession(commissioneeDeviceProxy);
31+
VerifyOrReturnError(commissioneeDeviceProxy->GetSecureSession().HasValue(), CHIP_ERROR_INCORRECT_STATE);
32+
return CloseSession(*commissioneeDeviceProxy->GetExchangeManager(), commissioneeDeviceProxy->GetSecureSession().Value());
3233
}
3334

3435
return CurrentCommissioner().GetConnectedDevice(mDestinationId, &mOnDeviceConnectedCallback,
3536
&mOnDeviceConnectionFailureCallback);
3637
}
3738

38-
CHIP_ERROR CloseSessionCommand::CloseSession(DeviceProxy * device)
39+
CHIP_ERROR CloseSessionCommand::CloseSession(Messaging::ExchangeManager & exchangeMgr, const SessionHandle & sessionHandle)
3940
{
40-
VerifyOrReturnError(device->GetSecureSession().HasValue(), CHIP_ERROR_INCORRECT_STATE);
41-
4241
// TODO perhaps factor out this code into something on StatusReport that
4342
// takes an exchange and maybe a SendMessageFlags?
4443
SecureChannel::StatusReport statusReport(SecureChannel::GeneralStatusCode::kSuccess, SecureChannel::Id,
@@ -51,7 +50,7 @@ CHIP_ERROR CloseSessionCommand::CloseSession(DeviceProxy * device)
5150
System::PacketBufferHandle msg = bbuf.Finalize();
5251
VerifyOrReturnError(!msg.IsNull(), CHIP_ERROR_NO_MEMORY);
5352

54-
auto * exchange = device->GetExchangeManager()->NewContext(device->GetSecureSession().Value(), nullptr);
53+
auto * exchange = exchangeMgr.NewContext(sessionHandle, nullptr);
5554
VerifyOrReturnError(exchange != nullptr, CHIP_ERROR_NO_MEMORY);
5655

5756
// Per spec, CloseSession reports are always sent with MRP disabled.
@@ -69,12 +68,13 @@ CHIP_ERROR CloseSessionCommand::CloseSession(DeviceProxy * device)
6968
return err;
7069
}
7170

72-
void CloseSessionCommand::OnDeviceConnectedFn(void * context, OperationalDeviceProxy * device)
71+
void CloseSessionCommand::OnDeviceConnectedFn(void * context, Messaging::ExchangeManager & exchangeMgr,
72+
SessionHandle & sessionHandle)
7373
{
7474
auto * command = reinterpret_cast<CloseSessionCommand *>(context);
7575
VerifyOrReturn(command != nullptr, ChipLogError(chipTool, "OnDeviceConnectedFn: context is null"));
7676

77-
CHIP_ERROR err = command->CloseSession(device);
77+
CHIP_ERROR err = command->CloseSession(exchangeMgr, sessionHandle);
7878
VerifyOrReturn(CHIP_NO_ERROR == err, command->SetCommandExitStatus(err));
7979
}
8080

Diff for: examples/chip-tool/commands/pairing/CloseSessionCommand.h

+4-3
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
#pragma once
2020

2121
#include "../common/CHIPCommand.h"
22-
#include <app/OperationalDeviceProxy.h>
22+
#include <app/OperationalSessionSetup.h>
2323
#include <lib/core/CHIPCallback.h>
2424
#include <lib/core/DataModelTypes.h>
2525

@@ -46,11 +46,12 @@ class CloseSessionCommand : public CHIPCommand
4646
chip::NodeId mDestinationId;
4747
chip::Optional<uint16_t> mTimeoutSecs;
4848

49-
static void OnDeviceConnectedFn(void * context, chip::OperationalDeviceProxy * device);
49+
static void OnDeviceConnectedFn(void * context, chip::Messaging::ExchangeManager & exchangeMgr,
50+
chip::SessionHandle & sessionHandle);
5051
static void OnDeviceConnectionFailureFn(void * context, const chip::ScopedNodeId & peerId, CHIP_ERROR error);
5152

5253
// Try to send the action CloseSession status report.
53-
CHIP_ERROR CloseSession(chip::DeviceProxy * device);
54+
CHIP_ERROR CloseSession(chip::Messaging::ExchangeManager & exchangeMgr, const chip::SessionHandle & sessionHandle);
5455

5556
chip::Callback::Callback<chip::OnDeviceConnected> mOnDeviceConnectedCallback;
5657
chip::Callback::Callback<chip::OnDeviceConnectionFailure> mOnDeviceConnectionFailureCallback;

Diff for: examples/chip-tool/commands/tests/TestCommand.cpp

+3-2
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,13 @@ CHIP_ERROR TestCommand::WaitForCommissionee(const char * identity,
5151
&mOnDeviceConnectionFailureCallback);
5252
}
5353

54-
void TestCommand::OnDeviceConnectedFn(void * context, chip::OperationalDeviceProxy * device)
54+
void TestCommand::OnDeviceConnectedFn(void * context, chip::Messaging::ExchangeManager & exchangeMgr,
55+
chip::SessionHandle & sessionHandle)
5556
{
5657
ChipLogProgress(chipTool, " **** Test Setup: Device Connected\n");
5758
auto * command = static_cast<TestCommand *>(context);
5859
VerifyOrReturn(command != nullptr, ChipLogError(chipTool, "Device connected, but cannot run the test, as the context is null"));
59-
command->mDevices[command->GetIdentity()] = device;
60+
command->mDevices[command->GetIdentity()] = std::make_unique<chip::OperationalDeviceProxy>(&exchangeMgr, sessionHandle);
6061

6162
LogErrorOnFailure(command->ContinueOnChipMainThread(CHIP_NO_ERROR));
6263
}

Diff for: examples/chip-tool/commands/tests/TestCommand.h

+4-3
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,11 @@ class TestCommand : public TestRunner,
6767
void OnWaitForMs() override { NextTest(); };
6868

6969
/////////// Interaction Model Interface /////////
70-
chip::DeviceProxy * GetDevice(const char * identity) override { return mDevices[identity]; }
70+
chip::DeviceProxy * GetDevice(const char * identity) override { return mDevices[identity].get(); }
7171
void OnResponse(const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override{};
7272

73-
static void OnDeviceConnectedFn(void * context, chip::OperationalDeviceProxy * device);
73+
static void OnDeviceConnectedFn(void * context, chip::Messaging::ExchangeManager & exchangeMgr,
74+
chip::SessionHandle & sessionHandle);
7475
static void OnDeviceConnectionFailureFn(void * context, const chip::ScopedNodeId & peerId, CHIP_ERROR error);
7576

7677
CHIP_ERROR ContinueOnChipMainThread(CHIP_ERROR err) override;
@@ -94,7 +95,7 @@ class TestCommand : public TestRunner,
9495

9596
chip::Optional<char *> mPICSFilePath;
9697
chip::Optional<uint16_t> mTimeout;
97-
std::map<std::string, chip::DeviceProxy *> mDevices;
98+
std::map<std::string, std::unique_ptr<chip::OperationalDeviceProxy>> mDevices;
9899

99100
// When set to false, prevents interaction model events from affecting the current test status.
100101
// This flag exists because if an error happens while processing a response the allocated

Diff for: examples/light-switch-app/ameba/main/BindingHandler.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ Engine sShellSwitchBindingSubCommands;
5050

5151
namespace {
5252

53-
void ProcessOnOffUnicastBindingCommand(CommandId commandId, const EmberBindingTableEntry & binding, DeviceProxy * peer_device)
53+
void ProcessOnOffUnicastBindingCommand(CommandId commandId, const EmberBindingTableEntry & binding,
54+
OperationalDeviceProxy * peer_device)
5455
{
5556
auto onSuccess = [](const ConcreteCommandPath & commandPath, const StatusIB & status, const auto & dataResponse) {
5657
ChipLogProgress(NotSpecified, "OnOff command succeeds");
@@ -60,6 +61,7 @@ void ProcessOnOffUnicastBindingCommand(CommandId commandId, const EmberBindingTa
6061
ChipLogError(NotSpecified, "OnOff command failed: %" CHIP_ERROR_FORMAT, error.Format());
6162
};
6263

64+
VerifyOrDie(peer_device != nullptr && peer_device->ConnectionReady());
6365
switch (commandId)
6466
{
6567
case Clusters::OnOff::Commands::Toggle::Id:
@@ -106,7 +108,7 @@ void ProcessOnOffGroupBindingCommand(CommandId commandId, const EmberBindingTabl
106108
}
107109
}
108110

109-
void LightSwitchChangedHandler(const EmberBindingTableEntry & binding, DeviceProxy * peer_device, void * context)
111+
void LightSwitchChangedHandler(const EmberBindingTableEntry & binding, OperationalDeviceProxy * peer_device, void * context)
110112
{
111113
VerifyOrReturn(context != nullptr, ChipLogError(NotSpecified, "OnDeviceConnectedFn: context is null"));
112114
BindingCommandData * data = static_cast<BindingCommandData *>(context);

Diff for: examples/light-switch-app/efr32/src/binding-handler.cpp

+9-9
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ Engine sShellSwitchBindingSubCommands;
5151

5252
namespace {
5353

54-
void ProcessOnOffUnicastBindingCommand(CommandId commandId, const EmberBindingTableEntry & binding, DeviceProxy * peer_device)
54+
void ProcessOnOffUnicastBindingCommand(CommandId commandId, const EmberBindingTableEntry & binding,
55+
Messaging::ExchangeManager * exchangeMgr, const SessionHandle & sessionHandle)
5556
{
5657
auto onSuccess = [](const ConcreteCommandPath & commandPath, const StatusIB & status, const auto & dataResponse) {
5758
ChipLogProgress(NotSpecified, "OnOff command succeeds");
@@ -65,20 +66,17 @@ void ProcessOnOffUnicastBindingCommand(CommandId commandId, const EmberBindingTa
6566
{
6667
case Clusters::OnOff::Commands::Toggle::Id:
6768
Clusters::OnOff::Commands::Toggle::Type toggleCommand;
68-
Controller::InvokeCommandRequest(peer_device->GetExchangeManager(), peer_device->GetSecureSession().Value(), binding.remote,
69-
toggleCommand, onSuccess, onFailure);
69+
Controller::InvokeCommandRequest(exchangeMgr, sessionHandle, binding.remote, toggleCommand, onSuccess, onFailure);
7070
break;
7171

7272
case Clusters::OnOff::Commands::On::Id:
7373
Clusters::OnOff::Commands::On::Type onCommand;
74-
Controller::InvokeCommandRequest(peer_device->GetExchangeManager(), peer_device->GetSecureSession().Value(), binding.remote,
75-
onCommand, onSuccess, onFailure);
74+
Controller::InvokeCommandRequest(exchangeMgr, sessionHandle, binding.remote, onCommand, onSuccess, onFailure);
7675
break;
7776

7877
case Clusters::OnOff::Commands::Off::Id:
7978
Clusters::OnOff::Commands::Off::Type offCommand;
80-
Controller::InvokeCommandRequest(peer_device->GetExchangeManager(), peer_device->GetSecureSession().Value(), binding.remote,
81-
offCommand, onSuccess, onFailure);
79+
Controller::InvokeCommandRequest(exchangeMgr, sessionHandle, binding.remote, offCommand, onSuccess, onFailure);
8280
break;
8381
}
8482
}
@@ -107,7 +105,7 @@ void ProcessOnOffGroupBindingCommand(CommandId commandId, const EmberBindingTabl
107105
}
108106
}
109107

110-
void LightSwitchChangedHandler(const EmberBindingTableEntry & binding, DeviceProxy * peer_device, void * context)
108+
void LightSwitchChangedHandler(const EmberBindingTableEntry & binding, OperationalDeviceProxy * peer_device, void * context)
111109
{
112110
VerifyOrReturn(context != nullptr, ChipLogError(NotSpecified, "OnDeviceConnectedFn: context is null"));
113111
BindingCommandData * data = static_cast<BindingCommandData *>(context);
@@ -126,7 +124,9 @@ void LightSwitchChangedHandler(const EmberBindingTableEntry & binding, DevicePro
126124
switch (data->clusterId)
127125
{
128126
case Clusters::OnOff::Id:
129-
ProcessOnOffUnicastBindingCommand(data->commandId, binding, peer_device);
127+
VerifyOrDie(peer_device != nullptr && peer_device->ConnectionReady());
128+
ProcessOnOffUnicastBindingCommand(data->commandId, binding, peer_device->GetExchangeManager(),
129+
peer_device->GetSecureSession().Value());
130130
break;
131131
}
132132
}

Diff for: examples/light-switch-app/esp32/main/BindingHandler.cpp

+9-9
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ Engine sShellSwitchBindingSubCommands;
5050

5151
namespace {
5252

53-
void ProcessOnOffUnicastBindingCommand(CommandId commandId, const EmberBindingTableEntry & binding, DeviceProxy * peer_device)
53+
void ProcessOnOffUnicastBindingCommand(CommandId commandId, const EmberBindingTableEntry & binding,
54+
Messaging::ExchangeManager * exchangeMgr, const SessionHandle & sessionHandle)
5455
{
5556
auto onSuccess = [](const ConcreteCommandPath & commandPath, const StatusIB & status, const auto & dataResponse) {
5657
ChipLogProgress(NotSpecified, "OnOff command succeeds");
@@ -64,20 +65,17 @@ void ProcessOnOffUnicastBindingCommand(CommandId commandId, const EmberBindingTa
6465
{
6566
case Clusters::OnOff::Commands::Toggle::Id:
6667
Clusters::OnOff::Commands::Toggle::Type toggleCommand;
67-
Controller::InvokeCommandRequest(peer_device->GetExchangeManager(), peer_device->GetSecureSession().Value(), binding.remote,
68-
toggleCommand, onSuccess, onFailure);
68+
Controller::InvokeCommandRequest(exchangeMgr, sessionHandle, binding.remote, toggleCommand, onSuccess, onFailure);
6969
break;
7070

7171
case Clusters::OnOff::Commands::On::Id:
7272
Clusters::OnOff::Commands::On::Type onCommand;
73-
Controller::InvokeCommandRequest(peer_device->GetExchangeManager(), peer_device->GetSecureSession().Value(), binding.remote,
74-
onCommand, onSuccess, onFailure);
73+
Controller::InvokeCommandRequest(exchangeMgr, sessionHandle, binding.remote, onCommand, onSuccess, onFailure);
7574
break;
7675

7776
case Clusters::OnOff::Commands::Off::Id:
7877
Clusters::OnOff::Commands::Off::Type offCommand;
79-
Controller::InvokeCommandRequest(peer_device->GetExchangeManager(), peer_device->GetSecureSession().Value(), binding.remote,
80-
offCommand, onSuccess, onFailure);
78+
Controller::InvokeCommandRequest(exchangeMgr, sessionHandle, binding.remote, offCommand, onSuccess, onFailure);
8179
break;
8280
}
8381
}
@@ -106,7 +104,7 @@ void ProcessOnOffGroupBindingCommand(CommandId commandId, const EmberBindingTabl
106104
}
107105
}
108106

109-
void LightSwitchChangedHandler(const EmberBindingTableEntry & binding, DeviceProxy * peer_device, void * context)
107+
void LightSwitchChangedHandler(const EmberBindingTableEntry & binding, OperationalDeviceProxy * peer_device, void * context)
110108
{
111109
VerifyOrReturn(context != nullptr, ChipLogError(NotSpecified, "OnDeviceConnectedFn: context is null"));
112110
BindingCommandData * data = static_cast<BindingCommandData *>(context);
@@ -125,7 +123,9 @@ void LightSwitchChangedHandler(const EmberBindingTableEntry & binding, DevicePro
125123
switch (data->clusterId)
126124
{
127125
case Clusters::OnOff::Id:
128-
ProcessOnOffUnicastBindingCommand(data->commandId, binding, peer_device);
126+
VerifyOrDie(peer_device != nullptr && peer_device->ConnectionReady());
127+
ProcessOnOffUnicastBindingCommand(data->commandId, binding, peer_device->GetExchangeManager(),
128+
peer_device->GetSecureSession().Value());
129129
break;
130130
}
131131
}

0 commit comments

Comments
 (0)