diff --git a/src/core/thread/meshcop_dataset_manager.cpp b/src/core/thread/meshcop_dataset_manager.cpp index efc8e14ea..710ad3cea 100644 --- a/src/core/thread/meshcop_dataset_manager.cpp +++ b/src/core/thread/meshcop_dataset_manager.cpp @@ -271,6 +271,34 @@ void DatasetManager::HandleSet(Coap::Header &aHeader, Message &aMessage, const I ExitNow(state = StateTlv::kReject); } + // verify session id is the same + if (tlvType == Tlv::kCommissionerSessionId) + { + uint8_t *cur; + uint8_t *end; + uint8_t length; + + cur = mNetworkDataLeader.GetCommissioningData(length); + end = cur + length; + + while (cur < end) + { + Tlv *data = reinterpret_cast(cur); + + if (data->GetType() == Tlv::kCommissionerSessionId) + { + uint16_t sessionId; + + sessionId = static_cast(data)->GetCommissionerSessionId(); + VerifyOrExit(sessionId == static_cast(&tlv)->GetCommissionerSessionId(), + state = StateTlv::kReject); + break; + } + + cur += sizeof(Tlv) + data->GetLength(); + } + } + offset += sizeof(tlv) + tlv.GetLength(); }