Enhance MeshCoP::DataManager::HandleSet (#673)

* Enhance MeshCoP::DataManager::HandleSet
This commit is contained in:
Lu Wang
2016-09-25 20:49:35 -07:00
committed by Jonathan Hui
parent 33dba76918
commit dc2dcbd282
2 changed files with 26 additions and 2 deletions
+2 -1
View File
@@ -46,7 +46,8 @@ class Dataset
public:
enum
{
kMaxSize = 256, ///< Maximum size of MeshCoP Dataset (bytes)
kMaxSize = 256, ///< Maximum size of MeshCoP Dataset (bytes)
kMaxValueSize = 16, /// < Maximum size of each Dataset TLV value (bytes)
};
/**
+24 -1
View File
@@ -299,6 +299,9 @@ void DatasetManager::HandleSet(Coap::Header &aHeader, Message &aMessage, const I
}
}
// verify that TLV data size is less than maximum TLV value size
VerifyOrExit(tlv.GetLength() <= Dataset::kMaxValueSize, state = StateTlv::kReject);
offset += sizeof(tlv) + tlv.GetLength();
}
@@ -306,7 +309,27 @@ void DatasetManager::HandleSet(Coap::Header &aHeader, Message &aMessage, const I
VerifyOrExit(offset == aMessage.GetLength() && (mLocal.GetTimestamp() == NULL ||
mLocal.GetTimestamp()->Compare(timestamp) > 0), state = StateTlv::kReject);
mLocal.Set(aMessage, aMessage.GetOffset(), static_cast<uint8_t>(aMessage.GetLength() - aMessage.GetOffset()));
// verify that does not overflow dataset buffer
VerifyOrExit((offset - aMessage.GetOffset()) <= Dataset::kMaxSize, state = StateTlv::kReject);
// update dataset
offset = aMessage.GetOffset();
while (offset < aMessage.GetLength())
{
OT_TOOL_PACKED_BEGIN
struct
{
Tlv tlv;
uint8_t value[Dataset::kMaxValueSize];
} OT_TOOL_PACKED_END data;
aMessage.Read(offset, sizeof(Tlv), &data.tlv);
aMessage.Read(offset + sizeof(Tlv), data.tlv.GetLength(), data.value);
mLocal.Set(data.tlv);
offset += sizeof(Tlv) + data.tlv.GetLength();
}
mNetwork = mLocal;
mNetworkDataLeader.IncrementVersion();
mNetworkDataLeader.IncrementStableVersion();