mirror of
https://github.com/espressif/openthread.git
synced 2026-08-26 20:19:53 +00:00
[hist-tracker] use Tlv::ParsedInfo for robust TLV parsing (#12229)
This commit updates `Server::PrepareAndSendAnswers()` to utilize `Tlv::ParsedInfo` for more robust TLV parsing and validation. This ensures correct validation and size calculation for both standard and extended TLVs when iterating over TLVs through the received message. This change also adds an explicit check to skip over extended TLVs, ensuring the implementation correctly handles cases where extended TLVs may be present.
This commit is contained in:
@@ -128,13 +128,13 @@ void Server::FreeAllRelatedAnswers(Coap::Message &aFirstAnswer)
|
||||
|
||||
void Server::PrepareAndSendAnswers(const Ip6::Address &aDestination, const Message &aRequest)
|
||||
{
|
||||
Coap::Message *answer;
|
||||
Error error;
|
||||
AnswerInfo info;
|
||||
OffsetRange offsetRange;
|
||||
Tlv tlv;
|
||||
RequestTlv requestTlv;
|
||||
AnswerTlv answerTlv;
|
||||
Coap::Message *answer;
|
||||
Error error;
|
||||
AnswerInfo info;
|
||||
OffsetRange offsetRange;
|
||||
Tlv::ParsedInfo tlvInfo;
|
||||
RequestTlv requestTlv;
|
||||
AnswerTlv answerTlv;
|
||||
|
||||
if (Tlv::Find<QueryIdTlv>(aRequest, info.mQueryId) == kErrorNone)
|
||||
{
|
||||
@@ -147,12 +147,16 @@ void Server::PrepareAndSendAnswers(const Ip6::Address &aDestination, const Messa
|
||||
|
||||
offsetRange.InitFromMessageOffsetToEnd(aRequest);
|
||||
|
||||
for (; !offsetRange.IsEmpty(); offsetRange.AdvanceOffset(tlv.GetSize()))
|
||||
for (; !offsetRange.IsEmpty(); offsetRange.AdvanceOffset(tlvInfo.GetSize()))
|
||||
{
|
||||
SuccessOrExit(error = aRequest.Read(offsetRange, tlv));
|
||||
VerifyOrExit(offsetRange.Contains(tlv.GetSize()), error = kErrorParse);
|
||||
SuccessOrExit(error = tlvInfo.ParseFrom(aRequest, offsetRange));
|
||||
|
||||
if (tlv.GetType() == Tlv::kRequest)
|
||||
if (tlvInfo.mIsExtended)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (tlvInfo.mType == Tlv::kRequest)
|
||||
{
|
||||
SuccessOrExit(error = aRequest.Read(offsetRange, requestTlv));
|
||||
VerifyOrExit(requestTlv.IsValid(), error = kErrorParse);
|
||||
|
||||
Reference in New Issue
Block a user