Skip to content

Commit a065112

Browse files
committed
Use Optional<ExchangeHandle> variable instead of ExchangeContext in PairingSession.
This ensures that the ExchangeContext for the session is automatically reference counted without explicit manual Retain() and Release() calls. As a result, the ExchangeContext is held until PairingSession::Clear() gets called that, in turn, calls ClearValue() on the Optional to internally call Release() on the underlying target. Fixes Issue project-chip#32498.
1 parent 3dc2320 commit a065112

File tree

4 files changed

+73
-62
lines changed

4 files changed

+73
-62
lines changed

src/protocols/secure_channel/CASESession.cpp

+28-22
Original file line numberDiff line numberDiff line change
@@ -514,7 +514,7 @@ CHIP_ERROR CASESession::EstablishSession(SessionManager & sessionManager, Fabric
514514

515515
// We are setting the exchange context specifically before checking for error.
516516
// This is to make sure the exchange will get closed if Init() returned an error.
517-
mExchangeCtxt = exchangeCtxt;
517+
mExchangeCtxt.Emplace(*exchangeCtxt);
518518

519519
// From here onwards, let's go to exit on error, as some state might have already
520520
// been initialized
@@ -527,7 +527,7 @@ CHIP_ERROR CASESession::EstablishSession(SessionManager & sessionManager, Fabric
527527
mSessionResumptionStorage = sessionResumptionStorage;
528528
mLocalMRPConfig = mrpLocalConfig.ValueOr(GetDefaultMRPConfig());
529529

530-
mExchangeCtxt->UseSuggestedResponseTimeout(kExpectedSigma1ProcessingTime);
530+
mExchangeCtxt.Value()->UseSuggestedResponseTimeout(kExpectedSigma1ProcessingTime);
531531
mPeerNodeId = peerScopedNodeId.GetNodeId();
532532
mLocalNodeId = fabricInfo->GetNodeId();
533533

@@ -549,7 +549,8 @@ void CASESession::OnResponseTimeout(ExchangeContext * ec)
549549
{
550550
MATTER_TRACE_SCOPE("OnResponseTimeout", "CASESession");
551551
VerifyOrReturn(ec != nullptr, ChipLogError(SecureChannel, "CASESession::OnResponseTimeout was called by null exchange"));
552-
VerifyOrReturn(mExchangeCtxt == ec, ChipLogError(SecureChannel, "CASESession::OnResponseTimeout exchange doesn't match"));
552+
VerifyOrReturn(mExchangeCtxt.HasValue() && (&mExchangeCtxt.Value().Get() == ec),
553+
ChipLogError(SecureChannel, "CASESession::OnResponseTimeout exchange doesn't match"));
553554
ChipLogError(SecureChannel, "CASESession timed out while waiting for a response from the peer. Current state was %u",
554555
to_underlying(mState));
555556
MATTER_TRACE_COUNTER("CASETimeout");
@@ -735,8 +736,8 @@ CHIP_ERROR CASESession::SendSigma1()
735736
ReturnErrorOnFailure(mCommissioningHash.AddData(ByteSpan{ msg_R1->Start(), msg_R1->DataLength() }));
736737

737738
// Call delegate to send the msg to peer
738-
ReturnErrorOnFailure(mExchangeCtxt->SendMessage(Protocols::SecureChannel::MsgType::CASE_Sigma1, std::move(msg_R1),
739-
SendFlags(SendMessageFlags::kExpectResponse)));
739+
ReturnErrorOnFailure(mExchangeCtxt.Value()->SendMessage(Protocols::SecureChannel::MsgType::CASE_Sigma1, std::move(msg_R1),
740+
SendFlags(SendMessageFlags::kExpectResponse)));
740741

741742
mState = resuming ? State::kSentSigma1Resume : State::kSentSigma1;
742743

@@ -959,8 +960,9 @@ CHIP_ERROR CASESession::SendSigma2Resume()
959960
ReturnErrorOnFailure(tlvWriter.Finalize(&msg_R2_resume));
960961

961962
// Call delegate to send the msg to peer
962-
ReturnErrorOnFailure(mExchangeCtxt->SendMessage(Protocols::SecureChannel::MsgType::CASE_Sigma2Resume, std::move(msg_R2_resume),
963-
SendFlags(SendMessageFlags::kExpectResponse)));
963+
ReturnErrorOnFailure(mExchangeCtxt.Value()->SendMessage(Protocols::SecureChannel::MsgType::CASE_Sigma2Resume,
964+
std::move(msg_R2_resume),
965+
SendFlags(SendMessageFlags::kExpectResponse)));
964966

965967
mState = State::kSentSigma2Resume;
966968

@@ -1096,8 +1098,8 @@ CHIP_ERROR CASESession::SendSigma2()
10961098
ReturnErrorOnFailure(mCommissioningHash.AddData(ByteSpan{ msg_R2->Start(), msg_R2->DataLength() }));
10971099

10981100
// Call delegate to send the msg to peer
1099-
ReturnErrorOnFailure(mExchangeCtxt->SendMessage(Protocols::SecureChannel::MsgType::CASE_Sigma2, std::move(msg_R2),
1100-
SendFlags(SendMessageFlags::kExpectResponse)));
1101+
ReturnErrorOnFailure(mExchangeCtxt.Value()->SendMessage(Protocols::SecureChannel::MsgType::CASE_Sigma2, std::move(msg_R2),
1102+
SendFlags(SendMessageFlags::kExpectResponse)));
11011103

11021104
mState = State::kSentSigma2;
11031105

@@ -1148,7 +1150,8 @@ CHIP_ERROR CASESession::HandleSigma2Resume(System::PacketBufferHandle && msg)
11481150
if (tlvReader.Next() != CHIP_END_OF_TLV)
11491151
{
11501152
SuccessOrExit(err = DecodeMRPParametersIfPresent(TLV::ContextTag(4), tlvReader));
1151-
mExchangeCtxt->GetSessionHandle()->AsUnauthenticatedSession()->SetRemoteSessionParameters(GetRemoteSessionParameters());
1153+
mExchangeCtxt.Value()->GetSessionHandle()->AsUnauthenticatedSession()->SetRemoteSessionParameters(
1154+
GetRemoteSessionParameters());
11521155
}
11531156

11541157
ChipLogDetail(SecureChannel, "Peer assigned session session ID %d", responderSessionId);
@@ -1341,7 +1344,8 @@ CHIP_ERROR CASESession::HandleSigma2(System::PacketBufferHandle && msg)
13411344
if (tlvReader.Next() != CHIP_END_OF_TLV)
13421345
{
13431346
SuccessOrExit(err = DecodeMRPParametersIfPresent(TLV::ContextTag(kTag_Sigma2_ResponderMRPParams), tlvReader));
1344-
mExchangeCtxt->GetSessionHandle()->AsUnauthenticatedSession()->SetRemoteSessionParameters(GetRemoteSessionParameters());
1347+
mExchangeCtxt.Value()->GetSessionHandle()->AsUnauthenticatedSession()->SetRemoteSessionParameters(
1348+
GetRemoteSessionParameters());
13451349
}
13461350

13471351
exit:
@@ -1410,7 +1414,7 @@ CHIP_ERROR CASESession::SendSigma3a()
14101414
{
14111415
SuccessOrExit(err = helper->ScheduleWork());
14121416
mSendSigma3Helper = helper;
1413-
mExchangeCtxt->WillSendMessage();
1417+
mExchangeCtxt.Value()->WillSendMessage();
14141418
mState = State::kSendSigma3Pending;
14151419
}
14161420
else
@@ -1537,8 +1541,8 @@ CHIP_ERROR CASESession::SendSigma3c(SendSigma3Data & data, CHIP_ERROR status)
15371541
SuccessOrExit(err);
15381542

15391543
// Call delegate to send the Msg3 to peer
1540-
err = mExchangeCtxt->SendMessage(Protocols::SecureChannel::MsgType::CASE_Sigma3, std::move(msg_R3),
1541-
SendFlags(SendMessageFlags::kExpectResponse));
1544+
err = mExchangeCtxt.Value()->SendMessage(Protocols::SecureChannel::MsgType::CASE_Sigma3, std::move(msg_R3),
1545+
SendFlags(SendMessageFlags::kExpectResponse));
15421546
SuccessOrExit(err);
15431547

15441548
ChipLogProgress(SecureChannel, "Sent Sigma3 msg");
@@ -1704,7 +1708,7 @@ CHIP_ERROR CASESession::HandleSigma3a(System::PacketBufferHandle && msg)
17041708

17051709
SuccessOrExit(err = helper->ScheduleWork());
17061710
mHandleSigma3Helper = helper;
1707-
mExchangeCtxt->WillSendMessage();
1711+
mExchangeCtxt.Value()->WillSendMessage();
17081712
mState = State::kHandleSigma3Pending;
17091713
}
17101714

@@ -2036,7 +2040,8 @@ CHIP_ERROR CASESession::ParseSigma1(TLV::ContiguousBufferTLVReader & tlvReader,
20362040
if (err == CHIP_NO_ERROR && tlvReader.GetTag() == ContextTag(kInitiatorMRPParamsTag))
20372041
{
20382042
ReturnErrorOnFailure(DecodeMRPParametersIfPresent(TLV::ContextTag(kInitiatorMRPParamsTag), tlvReader));
2039-
mExchangeCtxt->GetSessionHandle()->AsUnauthenticatedSession()->SetRemoteSessionParameters(GetRemoteSessionParameters());
2043+
mExchangeCtxt.Value()->GetSessionHandle()->AsUnauthenticatedSession()->SetRemoteSessionParameters(
2044+
GetRemoteSessionParameters());
20402045
err = tlvReader.Next();
20412046
}
20422047

@@ -2092,18 +2097,19 @@ CHIP_ERROR CASESession::ValidateReceivedMessage(ExchangeContext * ec, const Payl
20922097
// mExchangeCtxt can be nullptr if this is the first message (CASE_Sigma1) received by CASESession
20932098
// via UnsolicitedMessageHandler. The exchange context is allocated by exchange manager and provided
20942099
// to the handler (CASESession object).
2095-
if (mExchangeCtxt != nullptr)
2100+
if (mExchangeCtxt.HasValue())
20962101
{
2097-
if (mExchangeCtxt != ec)
2102+
if (&mExchangeCtxt.Value().Get() != ec)
20982103
{
20992104
ReturnErrorOnFailure(CHIP_ERROR_INVALID_ARGUMENT);
21002105
}
21012106
}
21022107
else
21032108
{
2104-
mExchangeCtxt = ec;
2109+
mExchangeCtxt.SetValue(ExchangeHandle(*ec));
2110+
mExchangeCtxt.Emplace(*ec);
21052111
}
2106-
mExchangeCtxt->UseSuggestedResponseTimeout(kExpectedHighProcessingTime);
2112+
mExchangeCtxt.Value()->UseSuggestedResponseTimeout(kExpectedHighProcessingTime);
21072113

21082114
VerifyOrReturnError(!msg.IsNull(), CHIP_ERROR_INVALID_ARGUMENT);
21092115
return CHIP_NO_ERROR;
@@ -2128,7 +2134,7 @@ CHIP_ERROR CASESession::OnMessageReceived(ExchangeContext * ec, const PayloadHea
21282134
//
21292135
// Should you need to resume the CASESession, you could theoretically pass along the msg to a callback that gets
21302136
// registered when setting mStopHandshakeAtState.
2131-
mExchangeCtxt->WillSendMessage();
2137+
mExchangeCtxt.Value()->WillSendMessage();
21322138
return CHIP_NO_ERROR;
21332139
}
21342140
#endif // CONFIG_BUILD_FOR_HOST_UNIT_TEST
@@ -2138,7 +2144,7 @@ CHIP_ERROR CASESession::OnMessageReceived(ExchangeContext * ec, const PayloadHea
21382144
msgType == Protocols::SecureChannel::MsgType::CASE_Sigma2Resume ||
21392145
msgType == Protocols::SecureChannel::MsgType::CASE_Sigma3)
21402146
{
2141-
SuccessOrExit(err = mExchangeCtxt->FlushAcks());
2147+
SuccessOrExit(err = mExchangeCtxt.Value()->FlushAcks());
21422148
}
21432149
#endif // CHIP_CONFIG_SLOW_CRYPTO
21442150

src/protocols/secure_channel/PASESession.cpp

+25-20
Original file line numberDiff line numberDiff line change
@@ -218,12 +218,12 @@ CHIP_ERROR PASESession::Pair(SessionManager & sessionManager, uint32_t peerSetUp
218218

219219
mRole = CryptoContext::SessionRole::kInitiator;
220220

221-
mExchangeCtxt = exchangeCtxt;
221+
mExchangeCtxt.Emplace(*exchangeCtxt);
222222

223223
// When commissioning starts, the peer is assumed to be active.
224-
mExchangeCtxt->GetSessionHandle()->AsUnauthenticatedSession()->MarkActiveRx();
224+
mExchangeCtxt.Value()->GetSessionHandle()->AsUnauthenticatedSession()->MarkActiveRx();
225225

226-
mExchangeCtxt->UseSuggestedResponseTimeout(kExpectedLowProcessingTime);
226+
mExchangeCtxt.Value()->UseSuggestedResponseTimeout(kExpectedLowProcessingTime);
227227

228228
mLocalMRPConfig = mrpLocalConfig.ValueOr(GetDefaultMRPConfig());
229229

@@ -244,7 +244,7 @@ void PASESession::OnResponseTimeout(ExchangeContext * ec)
244244
{
245245
MATTER_TRACE_SCOPE("OnResponseTimeout", "PASESession");
246246
VerifyOrReturn(ec != nullptr, ChipLogError(SecureChannel, "PASESession::OnResponseTimeout was called by null exchange"));
247-
VerifyOrReturn(mExchangeCtxt == nullptr || mExchangeCtxt == ec,
247+
VerifyOrReturn(!mExchangeCtxt.HasValue() || &mExchangeCtxt.Value().Get() == ec,
248248
ChipLogError(SecureChannel, "PASESession::OnResponseTimeout exchange doesn't match"));
249249
// If we were waiting for something, mNextExpectedMsg had better have a value.
250250
ChipLogError(SecureChannel, "PASESession timed out while waiting for a response from the peer. Expected message type was %u",
@@ -308,8 +308,8 @@ CHIP_ERROR PASESession::SendPBKDFParamRequest()
308308
// Update commissioning hash with the pbkdf2 param request that's being sent.
309309
ReturnErrorOnFailure(mCommissioningHash.AddData(ByteSpan{ req->Start(), req->DataLength() }));
310310

311-
ReturnErrorOnFailure(
312-
mExchangeCtxt->SendMessage(MsgType::PBKDFParamRequest, std::move(req), SendFlags(SendMessageFlags::kExpectResponse)));
311+
ReturnErrorOnFailure(mExchangeCtxt.Value()->SendMessage(MsgType::PBKDFParamRequest, std::move(req),
312+
SendFlags(SendMessageFlags::kExpectResponse)));
313313

314314
mNextExpectedMsg.SetValue(MsgType::PBKDFParamResponse);
315315

@@ -364,7 +364,8 @@ CHIP_ERROR PASESession::HandlePBKDFParamRequest(System::PacketBufferHandle && ms
364364
if (tlvReader.Next() != CHIP_END_OF_TLV)
365365
{
366366
SuccessOrExit(err = DecodeMRPParametersIfPresent(TLV::ContextTag(5), tlvReader));
367-
mExchangeCtxt->GetSessionHandle()->AsUnauthenticatedSession()->SetRemoteSessionParameters(GetRemoteSessionParameters());
367+
mExchangeCtxt.Value()->GetSessionHandle()->AsUnauthenticatedSession()->SetRemoteSessionParameters(
368+
GetRemoteSessionParameters());
368369
}
369370

370371
err = SendPBKDFParamResponse(ByteSpan(initiatorRandom), hasPBKDFParameters);
@@ -428,8 +429,8 @@ CHIP_ERROR PASESession::SendPBKDFParamResponse(ByteSpan initiatorRandom, bool in
428429
ReturnErrorOnFailure(mCommissioningHash.AddData(ByteSpan{ resp->Start(), resp->DataLength() }));
429430
ReturnErrorOnFailure(SetupSpake2p());
430431

431-
ReturnErrorOnFailure(
432-
mExchangeCtxt->SendMessage(MsgType::PBKDFParamResponse, std::move(resp), SendFlags(SendMessageFlags::kExpectResponse)));
432+
ReturnErrorOnFailure(mExchangeCtxt.Value()->SendMessage(MsgType::PBKDFParamResponse, std::move(resp),
433+
SendFlags(SendMessageFlags::kExpectResponse)));
433434
ChipLogDetail(SecureChannel, "Sent PBKDF param response");
434435

435436
mNextExpectedMsg.SetValue(MsgType::PASE_Pake1);
@@ -483,7 +484,8 @@ CHIP_ERROR PASESession::HandlePBKDFParamResponse(System::PacketBufferHandle && m
483484
if (tlvReader.Next() != CHIP_END_OF_TLV)
484485
{
485486
SuccessOrExit(err = DecodeMRPParametersIfPresent(TLV::ContextTag(5), tlvReader));
486-
mExchangeCtxt->GetSessionHandle()->AsUnauthenticatedSession()->SetRemoteSessionParameters(GetRemoteSessionParameters());
487+
mExchangeCtxt.Value()->GetSessionHandle()->AsUnauthenticatedSession()->SetRemoteSessionParameters(
488+
GetRemoteSessionParameters());
487489
}
488490

489491
// TODO - Add a unit test that exercises mHavePBKDFParameters path
@@ -508,7 +510,8 @@ CHIP_ERROR PASESession::HandlePBKDFParamResponse(System::PacketBufferHandle && m
508510
if (tlvReader.Next() != CHIP_END_OF_TLV)
509511
{
510512
SuccessOrExit(err = DecodeMRPParametersIfPresent(TLV::ContextTag(5), tlvReader));
511-
mExchangeCtxt->GetSessionHandle()->AsUnauthenticatedSession()->SetRemoteSessionParameters(GetRemoteSessionParameters());
513+
mExchangeCtxt.Value()->GetSessionHandle()->AsUnauthenticatedSession()->SetRemoteSessionParameters(
514+
GetRemoteSessionParameters());
512515
}
513516
}
514517

@@ -558,7 +561,7 @@ CHIP_ERROR PASESession::SendMsg1()
558561
ReturnErrorOnFailure(tlvWriter.Finalize(&msg));
559562

560563
ReturnErrorOnFailure(
561-
mExchangeCtxt->SendMessage(MsgType::PASE_Pake1, std::move(msg), SendFlags(SendMessageFlags::kExpectResponse)));
564+
mExchangeCtxt.Value()->SendMessage(MsgType::PASE_Pake1, std::move(msg), SendFlags(SendMessageFlags::kExpectResponse)));
562565
ChipLogDetail(SecureChannel, "Sent spake2p msg1");
563566

564567
mNextExpectedMsg.SetValue(MsgType::PASE_Pake2);
@@ -620,7 +623,8 @@ CHIP_ERROR PASESession::HandleMsg1_and_SendMsg2(System::PacketBufferHandle && ms
620623
SuccessOrExit(err = tlvWriter.EndContainer(outerContainerType));
621624
SuccessOrExit(err = tlvWriter.Finalize(&msg2));
622625

623-
err = mExchangeCtxt->SendMessage(MsgType::PASE_Pake2, std::move(msg2), SendFlags(SendMessageFlags::kExpectResponse));
626+
err =
627+
mExchangeCtxt.Value()->SendMessage(MsgType::PASE_Pake2, std::move(msg2), SendFlags(SendMessageFlags::kExpectResponse));
624628
SuccessOrExit(err);
625629

626630
mNextExpectedMsg.SetValue(MsgType::PASE_Pake3);
@@ -696,7 +700,8 @@ CHIP_ERROR PASESession::HandleMsg2_and_SendMsg3(System::PacketBufferHandle && ms
696700
SuccessOrExit(err = tlvWriter.EndContainer(outerContainerType));
697701
SuccessOrExit(err = tlvWriter.Finalize(&msg3));
698702

699-
err = mExchangeCtxt->SendMessage(MsgType::PASE_Pake3, std::move(msg3), SendFlags(SendMessageFlags::kExpectResponse));
703+
err =
704+
mExchangeCtxt.Value()->SendMessage(MsgType::PASE_Pake3, std::move(msg3), SendFlags(SendMessageFlags::kExpectResponse));
700705
SuccessOrExit(err);
701706

702707
mNextExpectedMsg.SetValue(MsgType::StatusReport);
@@ -786,25 +791,25 @@ CHIP_ERROR PASESession::ValidateReceivedMessage(ExchangeContext * exchange, cons
786791
// mExchangeCtxt can be nullptr if this is the first message (PBKDFParamRequest) received by PASESession
787792
// via UnsolicitedMessageHandler. The exchange context is allocated by exchange manager and provided
788793
// to the handler (PASESession object).
789-
if (mExchangeCtxt != nullptr)
794+
if (mExchangeCtxt.HasValue())
790795
{
791-
if (mExchangeCtxt != exchange)
796+
if (&mExchangeCtxt.Value().Get() != exchange)
792797
{
793798
ReturnErrorOnFailure(CHIP_ERROR_INVALID_ARGUMENT);
794799
}
795800
}
796801
else
797802
{
798-
mExchangeCtxt = exchange;
803+
mExchangeCtxt.Emplace(*exchange);
799804
}
800805

801-
if (!mExchangeCtxt->GetSessionHandle()->IsUnauthenticatedSession())
806+
if (!mExchangeCtxt.Value()->GetSessionHandle()->IsUnauthenticatedSession())
802807
{
803808
ChipLogError(SecureChannel, "PASESession received PBKDFParamRequest over encrypted session. Ignoring.");
804809
return CHIP_ERROR_INCORRECT_STATE;
805810
}
806811

807-
mExchangeCtxt->UseSuggestedResponseTimeout(kExpectedHighProcessingTime);
812+
mExchangeCtxt.Value()->UseSuggestedResponseTimeout(kExpectedHighProcessingTime);
808813

809814
VerifyOrReturnError(!msg.IsNull(), CHIP_ERROR_INVALID_ARGUMENT);
810815
VerifyOrReturnError((mNextExpectedMsg.HasValue() && payloadHeader.HasMessageType(mNextExpectedMsg.Value())) ||
@@ -833,7 +838,7 @@ CHIP_ERROR PASESession::OnMessageReceived(ExchangeContext * exchange, const Payl
833838
if (msgType == MsgType::PBKDFParamRequest || msgType == MsgType::PBKDFParamResponse || msgType == MsgType::PASE_Pake1 ||
834839
msgType == MsgType::PASE_Pake2 || msgType == MsgType::PASE_Pake3)
835840
{
836-
SuccessOrExit(err = mExchangeCtxt->FlushAcks());
841+
SuccessOrExit(err = mExchangeCtxt.Value()->FlushAcks());
837842
}
838843
#endif // CHIP_CONFIG_SLOW_CRYPTO
839844

src/protocols/secure_channel/PairingSession.cpp

+14-14
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ CHIP_ERROR PairingSession::ActivateSecureSession(const Transport::PeerAddress &
5656

5757
void PairingSession::Finish()
5858
{
59-
Transport::PeerAddress address = mExchangeCtxt->GetSessionHandle()->AsUnauthenticatedSession()->GetPeerAddress();
59+
Transport::PeerAddress address = mExchangeCtxt.Value()->GetSessionHandle()->AsUnauthenticatedSession()->GetPeerAddress();
6060

6161
// Discard the exchange so that Clear() doesn't try closing it. The exchange will handle that.
6262
DiscardExchange();
@@ -79,14 +79,15 @@ void PairingSession::Finish()
7979

8080
void PairingSession::DiscardExchange()
8181
{
82-
if (mExchangeCtxt != nullptr)
82+
if (mExchangeCtxt.HasValue())
8383
{
8484
// Make sure the exchange doesn't try to notify us when it closes,
8585
// since we might be dead by then.
86-
mExchangeCtxt->SetDelegate(nullptr);
86+
mExchangeCtxt.Value()->SetDelegate(nullptr);
87+
8788
// Null out mExchangeCtxt so that Clear() doesn't try closing it. The
8889
// exchange will handle that.
89-
mExchangeCtxt = nullptr;
90+
mExchangeCtxt.ClearValue();
9091
}
9192
}
9293

@@ -227,19 +228,18 @@ bool PairingSession::IsSessionEstablishmentInProgress()
227228

228229
void PairingSession::Clear()
229230
{
230-
// Clear acts like the destructor if PairingSession, if it is call during
231-
// middle of a pairing, means we should terminate the exchange. For normal
232-
// path, the exchange should already be discarded before calling Clear.
233-
if (mExchangeCtxt != nullptr)
231+
// Clear acts like the destructor of PairingSession. If it is called during
232+
// the middle of pairing, that means we should terminate the exchange. For the
233+
// normal path, the exchange should already be discarded before calling Clear.
234+
if (mExchangeCtxt.HasValue())
234235
{
235-
// The only time we reach this is if we are getting destroyed in the
236-
// middle of our handshake. In that case, there is no point trying to
237-
// do MRP resends of the last message we sent, so abort the exchange
236+
// The only time we reach this is when we are getting destroyed in the
237+
// middle of our handshake. In that case, there is no point in trying to
238+
// do MRP resends of the last message we sent. So, abort the exchange
238239
// instead of just closing it.
239-
mExchangeCtxt->Abort();
240-
mExchangeCtxt = nullptr;
240+
mExchangeCtxt.Value()->Abort();
241+
mExchangeCtxt.ClearValue();
241242
}
242-
243243
mSecureSessionHolder.Release();
244244
mPeerSessionId.ClearValue();
245245
mSessionManager = nullptr;

0 commit comments

Comments
 (0)